redis基础篇

Redis入门

启动Redis服务-服务端:双击Redis目录下redis-server.exe文件。

客户端:双击Redis目录下redis-cli.exe文件

Redis简介

Redis是一个基于==内存==的key-value结构数据库。

  1. 基于内存存储,读写性能高
  2. 单线程,每个命令具备原子性
  3. 支持数据持久化(一段时间后会将数据存储到磁盘中)
  4. 支持多语言客户端(java,python…)
  5. 社会存储热点数据(热点商品,资讯,新闻)
  6. 企业应用广泛

Redis数据类型

  1. 5中常用数据类型介绍

​ Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型

  1. 字符串String:普通字符串,Redis中最简单的数据类型。
  2. 哈希hash:也叫散列,类似于java中的HashMap结构。
  3. 列表list:按照差顺序排序,可以有触发元素,类似于java中linkedList。
  4. 集合set:无序集合,没有重复元素,类似于java中的HashSet。
  5. 有序集合sorted set/zset:集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素。

各种数据类型的特点

image-20240226110141644

Redis常用命令

字符串操作命令

  • set key value 设置指定key的值
  • get key 获取指定key的值
  • mset:批量添加多个string类型的键值对
  • mget:根据多个可以获取多个string类型的value
  • incr: 让一个整型的key自增1
  • incrby:让一个整型的key自增并指定步长,例如:incrby num 2让num值自增2
  • incrbyfloat:让一个浮点类型的数字自增并指定步长
  • Setex key seconds value 设置指定的key的值,并将key的过期时间设为seconds秒
  • Setnx key value 只有在key不存在时设置key的值

哈希操作命令

  • Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
  • hset key field value:将哈希表key中的字段field的值设为value
  • hget key field:获取存储在哈希表中指定字段
  • hmset:批量添加多个hash类型key的field的值
  • hmget:批量获取多个hash类型key的Field的值
  • hgetall:获取一个hash类型的key中的所有的field和value
  • hkeys:获取一个hash类型的key中的所有field
  • hvals:获取一个hash类型的key中的所有的field
  • hincrby:让一个hash类型key的字段值自增并指定步长
  • hsetnx:添加一个hash类型的key的field值,前提是这个field不存在,否则不行。
  • hdel key field 删除存储在哈希表中指定字段
  • hkeys key:获取哈希表中所有字段。
  • hvals key:获取哈希表中所有值。
  • image-20240226110351412

列表操作命令

  • Redis List列表是简单的字符串列表,按照插入顺序排序,可以有触发元素,类似于java中linkedList
  • lpush key value1【value2】:将一个或多个值插入到列表头部-l代表left
  • lpop key:移除并返回列表的第一个元素,没有则返回null
  • lrange key start stop:获取列表指定范围内的元素。
  • rpush key element:向列表右侧插入一个或多个元素
  • rpop key:移出并获取列表最后一个元素-r代表right
  • llen key:获取列表长度
  • blpop和brpop:与lpop和rpop类似,只不过在没有意思时等待指定时间,而不是直接返回nil
  • image-20240226110446919
  1. 利用List结构模拟一个栈:入口和出口在同一边。

  2. 利用List结构模拟一个队列:入口和出口在不同边。

  3. 利用List结构模拟一个阻塞队列:入口和出口在不同边,出队时采用blopop和brpop

集合操作命令

  • sadd key member1 [member2]:向集合添加一个或多个成员。
  • smembers key:返回集合中的所有成员
  • scard key :获取集合的成员数
  • sinter key1【key2】 :返回给定所有集合的交集。
  • sunion key1[key2]返回所有给定集合的并集。
  • sdiff key1 key2:求key1和key2的差集
  • srem key member1[member2] 删除集合中一个或多个成员。
  • sismember key member:判断一个元素是否存在于set中
  • image-20240226110537413

有序集合操作命令

  • Redis有序集合sortedSet是string类型元素的集合,且不允许有触发成员。每个元素都会管理员工double类型的分数。与java中的TreeSet类似,SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(skipList)加hash表。经常被用于实现排行榜功能。
  • zadd key score1 member1【score2 member2】:向有序集合添加一个或多个成员。
  • zrange key start stop[withscores]:通过索引区间返回有序集合中指定区间内的成员。
  • zincrby key increment member:有序集合中指定成员的分数加上增量increment
  • zrem key member【member】:移除有序集合中的一个或多个成员。
  • zscore key member:获取sorted中的指定元素的score值。
  • zrank key member:获取sortedSet中的指定元素的排名。
  • zcard key:获取sortedSet中元素个数
  • zcount key min max:统计score值在给定范围内的所有元素的个数
  • zdiff,zinter,zunion:求差集,交集,并集
  • image-20240226110620203

通用命令

  • Redis的通用命令是不分数据类型的,都可以使用的命令
  • keys pattern:查找所有符号给定模式(pattern)的key–如*
  • exists key:检查给定的key是否存在。
  • type key:返回key所存储的值的类型。
  • del key:该命令用于在key存在是删除key。
  • expire key:给一个key设置有效期,有效期到期时该key会被自动删除
  • ttl key:查看一个key的剩余有效期

key的结构

  1. Redis的key允许有多个单词形成层级结构,多个单词之间用‘ ’隔开,格式:项目名:业务名:类型:id
  2. 如user相关的key:heima:user:1
  3. 如果value 是一个java对象,例如user对象,则可以将对象序列化为JSON字符串后存储
  4. image-20240313185704076

在java中操作Redis

  1. Redis的java客户端
    • jedis
    • Lettuce
    • Spring Data Redis
    • Spring Data Redis是spring的一部分,对Redis底层开发包进行了高度封装。在spring项目中,可以使用spring Data Redis来简化操作。
  2. image-20240313204825448

Jedis

  1. 引入依赖image-20240313204917655
  2. 建立连接image-20240313204934049
  3. 测试Stringimage-20240313205318598
  4. 释放资源image-20240313205502410
  5. jedis连接池
    1. jedis本身是线程不安全的,并且频繁的创建和销毁连接会性能损耗,因此使用jedis连接池代替jedis的直连方式
    2. image-20240313212212300

Sprin Data Redis使用方式

  1. image-20240314195004371
  2. 引入依赖
    1. image-20240314195751374
  3. 配置文件
    1. image-20240314195807025
  4. 注入RedisTemplate
    1. image-20240314195832139
  5. 编写测试
    1. image-20240314195843962

SpringDataRedis的序列化方式

  1. RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认采用JDK序列化,得到结果
  2. image-20240314202917319
  3. 缺点:可读性差,内存占用较大
  4. 可以自定义RedisTemplate的序列化方式
  5. image-20240314203052250

重点——StringRedisTempalte

  1. Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认技术String方式,省去了自定义RedisTemplate的过程
  2. image-20240314210526097