文章目录
通用命令
redis-cli
: 登录redis客户端程序auth 密码
: 输入密码登录EXPIRE key second
: 设置一个key的有效期TTL key
: 查看key还有多长时间过期keys *
:查看当前库所有的keyexists key
: 判断某个key是否存在type key
查看你的key是什么类型del key
: 删除指定的key数据unlink key
: 非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作。ttl key
: 查看还有多少秒过期,-1表示永不过期,-2表示已过期expire key 秒钟
: 为给定的key设置过期时间move key dbindex(0-15)
: 将当前数据库的 key移动到给定的数据库 db 当中select dbindex
: 切换数据库【0-15】,默认为0dbsize
: 查看当前数据库key的数量flushdb
: 清空当前库flushal
: 通杀全部库
String类型
-
SET
: 添加一个新的键值对, 或者修改一个已经存在的键值对可选项:
这些可选项在其他类型的命令中大多也可以用, 不是只能string类型的value用
-
EX seconds
: 以秒为单位设置过期时间 -
PX mi1liseconds
: 以毫秒为单位设置过期时间 -
EXAT timestamp
: 设置以秒为单位的UNIX时间戳所对应的时间为过期时间 -
PXAT milliseconds-timestamp
: 设置以毫秒为单位的UNIX时间戳所对应的时间为过期时间 -
NX
: 键不存在的时候设置键值 -
XX
: 键存在的时候设置键值 -
KEEPTTL
:保留设置前指定键的生存时间 -
GET
:返回指定键原本的值,若键不存在时返回ni1
-
-
GET key
: 根据key获取string类型的value -
MSET key1 value1 key2 value2 ...
: 批量添加多个string类型的键值对 -
MGET key1 key2 key3...
: 根据多个key获取多个String类型的value -
INCR key
: 让一个整型的key自增1 -
INCRBY key increament
: 让一个整形的key自增指定步长increament -
INCRBYFLOAT key increament
: 让一个浮点型数字自增指定步长increament -
SETNX key value
: 添加一个string类型的键值对, 前提是这个键值对不存在, 如果存在则不执行 -
SETEX key second
: 添加一个string类型的键值对, 并且指定有效期秒second -
APPEND key value
:将value的值追加到key的后面 -
STRLEN key
: 获取key的长度
String类型表示JSON数据
KEY | VALUE |
---|---|
user:1 | {name:‘jack’,age:21} |
user:2 | {name:‘luck’,age:22} |
哈希类型
哈希类型的结构表
KEY | VALUE | |
field | value | |
heima:user:1 | name | 张三 |
age | 18 | |
heima:user:2 | name | 李四 |
age | 20 |
-
HSET key field value
:添加或者修改hash类型key的field的值 -
HGET key field
:获取一个hash类型key的field的值 -
HMSET
:批量添加多个hash类型key的field的值 -
HMGET
:批量获取多个hash类型key的field的值 -
HGETALL
:获取一个hash类型的key中的所有的field和value -
HKEYS
:获取一个hash类型的key中的所有的field -
HINCRBY
:让一个hash类型key的字段值自增并指定步长 -
HSETNX key field value
:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行 -
HKEYS hash
: 获取hash这个key对应的所有field -
HVALS hash
: 获取hash这个key对应的所有field的所有value
List类型
Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。
特征也与LinkedList类似:
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般
常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。
List的常见命令有:
-
LPUSH key element ...
:向列表左侧插入一个或多个元素 -
LPOP key
:移除并返回列表左侧的第一个元素,没有则返回nil -
RPUSH key element ...
:向列表右侧插入一个或多个元素 -
RPOP key
:移除并返回列表右侧的第一个元素 -
LRANGE key start end
:返回一段角标范围内的所有元素如果start = 0, end = -1 表示遍历全部
-
BLPOP和BRPOP
:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil -
LINDEX list index
: 按照索引index获取list中的元素 -
LLEN key
: 获取列表list的长度 -
LREM key N val
: 删除列表key中N个值为val的元素 -
LTRIM key start end
: 截取列表key中的start索引到end索引范围中的值后再赋值给列表key -
RPOPLPUSH 源列表 目标列表
: 表示移除源列表的最右侧的元素(rigth) 并添加到目标列表的最左边(left) -
LSET key index value
: 修改列表key指定索引中的元素, 修改为value -
LINSERT key BEFORE/AFTER 已有值 新值
:表示在列表key中的已有值前面(before)或者后面(after)插入新值
Set类型
Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:
无序
元素不可重复
查找快
支持交集、并集、差集等功能
Set的常见命令有:
-
SADD key member ...
:向set中添加一个或多个元素 -
SREM key member ...
: 移除set中的指定元素 -
SCARD key
: 返回set中元素的个数 -
SISMEMBER key member
:判断一个元素是否存在于set中 -
SMEMBERS
:获取set中的所有元素 -
SCARD
: 获取集合里面的元素个数 -
SRANDMEMBER key n
: 从集合中随机展示n个元素, 元素不删除 -
SPOP key n
: 从集合中随机弹出n个元素, 元素弹出后删除元素 -
SMOVE key1 key2 member
: 从key1中移出member到key2中
集合运算
-
SINTER key1 key2 ...
:求key1与key2的交集 -
SINTERCARD numkeys key [key...] [LIMIT limit]
: 不返回结果集, 而只返回结果基数具体用法:
如: SINTERCARD 2 key1 key2 limit 3
解释: 2表示要查看几个集合的交集
key1 key2 表示具体的set
limit是可选的, 后面跟什么数字就显示几个结果
比如key1 key2 的交集一共有3个 分别是1 a b
用这个命令则返回3 ,如果用
SINTER key1 key2
命令则返回具体的结果1 a b 如果limit后面是 2 的话, 则结果就是 2
-
SDIFF s1 s2
: 求s1与s2的差集 -
SUNION s1 s2
: 求key1和key2的并集差集: s1和s2的差集就是s1里面有, s2里面没有的
并集: s1和s2的所有元素 (重复元素只记录一次)
SortedSet类型
Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表。
SortedSet具备下列特性:
- 可排序
- 元素不重复
- 查询速度快
因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。
SortedSet的常见命令有:
-
ZADD key score member
:添加一个或多个元素到sorted set ,如果已经存在则更新其score值 -
ZREM key member
:删除sorted set中的一个指定元素 -
ZSCORE key member
: 获取sorted set中的指定元素的score值 -
ZRANK key member
:获取sorted set 中的指定元素的排名 -
ZCARD key
:获取sorted set中的元素个数 -
ZCOUNT key min max
:统计score值在给定范围内的所有元素的个数 -
ZINCRBY key increment member
:让sorted set中的指定元素自增,步长为指定的increment值 -
ZRANGE key min max [WITHSCORES]
:按照score排序后,获取指定排名范围内的元素 -
ZRANGEBYSCORE key min max [WITHSCORES]
:按照score排序后,获取指定score范围内的元素这个指令默认是大于等于min, 小于等于max的范围
加了 ( 则表示不包括min或者max
比如ZRANGEBYSCORE key (50 (70 表示范围在50到70之间, 不包括50和70
-
ZDIFF、ZINTER、ZUNION
:求差集、交集、并集
注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可,例如:
-
升序获取sorted set 中的指定元素的排名:ZRANK key member
-
降序获取sorted set 中的指定元素的排名:ZREVRANK key member
Bitmap类型
Redis中的位图(Bitmaps)是一种特殊的数据结构,它实际上是一个非常大的二进制数组,其中的每个元素(位)只能存储两种值:0 或 1。位图在Redis中被用于高效地处理集合和布尔型数据,尤其适用于大数据集的处理,因为它能够以极低的空间消耗存储大量的数据。
位图的每个位对应一个特定的偏移量(offset),这个偏移量通常用来表示某个特定的属性或状态。例如,你可以使用位图来跟踪一亿用户每天的登录状态,其中第N个位表示第N个用户是否登录过。
Bitmap的常见命令:
-
SETBIT key OFFSET value
: 设置或修改位图中指定偏移量位置的位的值key表示指定某个位图
offset 的位置应该填一个数字, 表示指定偏移量
value 表示要存入的值
-
GETBIT key OFFSET
: 获取位图中指定偏移量位置的位的值OFFSET表示偏移量的值, 类似于数组的索引的作用
-
STRLEN
: 统计字节数占多少这里不是统计有多少个bit, 而是统计有多少个字节被修改了, 返回的是字节的数量
-
BITCOUNT key
: 统计这个key中一共有多少个1 -
BITOP operation destination_key key [key ...]
: 用于对两个或多个位图进行位逻辑运算,并将结果保存到一个新的位图中它可以执行四种不同的位运算 写在
operation
中AND
:按位与运算OR
:按位或运算XOR
:按位异或运算NOT
:按位取反运算
HyperLogLog类型
HyperLogLog是一种概率算法,专门设计用于在大数据集上高效估算不同元素的个数,即基数(cardinality)。当数据集非常庞大时,直接存储所有元素并计算其基数会消耗大量的内存资源。HyperLogLog算法能够在有限的内存中给出一个近似但足够精确的基数估计值。
基数: 统计一个一个集合中不重复的元素的个数, 就是对集合中去重后的元素的计算
HyperLogLog的常见命令:
PFADD key element [element...]
: 添加指定元素到HyperLogLog中PFCOUNT key [key...]
: 返回给定的HyperLogLog的基数估算值PFMERGE destkey sourcekey [sourcekey...]
: 将多个HyperLogLog合并成一个HyperLogLog
GEO类型
Redis的GEO功能是在Redis 3.2版本中引入的,它允许用户存储和操作地理位置信息。GEO功能主要基于Sorted Set数据结构实现,但是它使用了一种特殊的编码方式——GeoHash,来将地理位置的经纬度坐标转换为可以排序的数值,从而使得基于位置的查询变得高效。
GEO常用命令:
-
GEOADD key 经度 纬度 value [经度 纬度 value...]
:向key中添加一条或多条数据 -
GEOPOS key member [member...]
: 从给定的key中返回所有指定名称member的经纬度, 不存在的返回nil -
GEOHASH key member [member...]
:返回member中存放的经纬度的GEOHASH表示 -
GEODIST key member1 member2 [m|km|fm|mi]
:统计两个位置之间的距离,[m|km|fm|mi]
表示不同的距离单位 -
GEORADIUS key 经度 纬度 radius unit [WITHDIST] [WITHHASH] [WITHCOORD] [ASC|DESC] [COUNT count] [STORE destination] [STOREDIST destination]
: 根据给定的经纬度坐标和半径,找到存储在特定键中的所有地理位置成员,这些成员在指定的地理范围内radius
: 指定查询的半径。unit
:指定半径的单位,可以是m
(米),km
(千米),mi
(英里),或ft
(英尺)。可选项:
WITHDIST
: 如果设置,返回结果会包含距离。WITHHASH
:如果设置,返回结果会包含GeoHash值。WITHCOORD
:如果设置,返回结果会包含经纬度坐标。ASC
或DESC
:指定结果的排序方式,升序或降序。COUNT count
:限制返回的结果数量。STORE destination
:如果设置,结果会被存储到指定的Sorted Set键中,而不返回给客户端。STOREDIST destination
:如果设置,结果的距离会被存储到指定的Sorted Set键中,而不返回给客户端。
Stream类型
Redis Stream是Redis 5.0版本引入的一种新的数据结构,它主要用于实现消息队列(Message Queue)的功能。与传统的列表(List)或发布/订阅(Pub/Sub)模式相比,Redis Stream提供了更强大的特性和持久性,使其成为处理实时数据流的理想选择。
名词 | 解释 | |
---|---|---|
1 | Message Content | 消息内容 |
2 | Consumer group | 消费组,通过XGROUP CREATE 命令创建,同一个消费组可以有多个消费者 |
3 | Last_delivered_id | 游标,每个消费组会有个游标 last_delivered_id,任意一个消费者读取了消息都会使游标 last_delivered_id 往前移动。 |
4 | Consumer | 消费者,消费组中的消费者 |
5 | Pending_ids | 消费者会有一个状态变量,用于记录被当前消费已读取但未ack的消息Id,如果客户端没有ack,这个变量里面的消息ID会越来越多,一旦某个消息被ack它就开始减少。这个pending_ids变量在Redis官方被称之为 PEL(Pending Entries List),记录了当前已经被客户端读取的消息,但是还没有 ack (Acknowledge character:确认字符),它用来确保客户端至少消费了消息一次,而不会在网络传输的中途丢失了没处理 |
特殊符号:
- +
:最小和最大可能出现的id$
: 表示只消费新的消息,当前流中最大的 id,可用于将要到来的信息,>
: 用于XREADGROUP命令,表示迄今还没有发送给组中使用者的信息,会更新消费者组的最后ID*
: 用于XADD命令中,让系统自动生成id
队列相关指令
-
XADD key * field value....
: 添加消息到stream的末尾*表示服务器自动生成MessageID
也可以自己指定值
-
XRANGE start end [COUNT count]
:用于获取消息列表start表示开始值, -表示最小值
end表示结束值, +表示最大值
count表示最多获取多少个值
-
XRANGE end start [COUNT count]
:用于获取消息列表(降序版) -
XDEL key id [id....]
: 根据id(MessageID) 删除一个或者多个消息 -
XLEN key
: 获取stream中的消息个数 -
XTRIM MAXLEN|MINID number
: 用于对stream的长度进行截取MAXLEN
表示stream的最大长度, 对流进行修剪限制长度MINID
允许的最小id, 比此id小的都被抛弃 -
XREAD key [COUNT count] [BLOCK milliseconds] STREAMS key [key...] ID [ID...]
: 用于获取一条或者多条消息可选项:
-
COUNT
: 最多读取多少条消息 -
BLOCK
: 是否以阻塞的方式读取消息, 默认不阻塞, 如果milliseconds设置0 表示永远阻塞 -
ID
: 这里写0-0代表从最小的ID开始获取Stream中的消息
写$则表示以当前Stream已经存储的最大的ID作为最后一个ID,当前不存在大于当前最大ID的消息,因此此时返回nil
-
消费组相关指令
-
XGROUP CREATE key 消费者组名称 MessageID
: 用于创建消费者组, 指定MessageID表示从stream流中哪个消息开始消费ID为0表示从头开始消费
ID为$ 表示只消费新的消息
-
XREADGROUP GROUP group consumer STREAMS key >
: 读取指定stream流中的信息group
指定是哪个消费组consumer
指定是消费组中的哪个消费者STREAMS
表示以流的形式读key
表示指定哪个stream流>
表示从第一条尚未被消费的消息开始读取stream中的消息一旦被消费组中的任意一个消费者读取了, 就不能再被该消费组中的其他消费者读取了,即同一个消费组里的消费者不能消费用一条消息 此时如果重复读取, 得到的值就是nil
-
XPENDING key group [consumer] [- +] [COUNT]
: 查询每个消费组内消费者已读取但未确认的消息只使用
XPENDING key group
的时候, 其只输出有关给定消费组的待处理消息的概要可选项:
consumer
: 可选参数,如果提供,则只显示属于这个消费者的未确认消息。count
: 可选参数,返回的未确认消息的最大数量。- +
: 表示筛选消息的范围, - + 表示所有未确认的消息
-
XACK key group MessageID
: 向消息队列确认消息处理已经完成 -
XINFO STREAM|GROUP|CONSUMER streamname|groupname|consumername
: 用于打印STREAM|GROUP|CONSUMER的详细信息
设置消费组的目的:
让组内的多个消费者共同分担读取信息, 所以, 通常让每个消费者读取部分信息 ,从而实现消息读取负载在多个消费者之间, 达到负载均衡.
redis持久化
RDB
RDB(Redis DataBase): 指的是在指定的时间间隔以内, 执行数据集的时间点快照
实现类似照片记录效果的方式,就是把某一时刻的数据和状态以文件的形式写到磁盘上,也就是
快照。这样一来即使故障宕机,快照文件也不会丢失,数据的可靠性也就得到了保证。
这个快照文件就称为RDB文件(dump.rdb),其中,RDB就是Redis DataBase的缩写。
自动触发
需要在redis配置文件中配置频率
手动触发
AOS
Jedis客户端
Jedis的官网地址: https://github.com/redis/jedis
1.1 入门
先来个快速入门:
1)引入依赖:
<!--jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.7.0</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>
2)建立连接
新建一个单元测试类,内容如下:
private Jedis jedis;
@BeforeEach
void setUp() {
// 1.建立连接
// jedis = new Jedis("192.168.150.101", 6379);
jedis = JedisConnectionFactory.getJedis();
// 2.设置密码
jedis.auth("123321");
// 3.选择库
jedis.select(0);
}
3)测试:
@Test
void testString() {
// 存入数据
String result = jedis.set("name", "虎哥");
System.out.println("result = " + result);
// 获取数据
String name = jedis.get("name");
System.out.println("name = " + name);
}
@Test
void testHash() {
// 插入hash数据
jedis.hset("user:1", "name", "Jack");
jedis.hset("user:1", "age", "21");
// 获取
Map<String, String> map = jedis.hgetAll("user:1");
System.out.println(map);
}
4)释放资源
@AfterEach
void tearDown() {
if (jedis != null) {
jedis.close();
}
}
1.2.SpringDataRedis客户端
SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址:https://spring.io/projects/spring-data-redis
- 提供了对不同Redis客户端的整合(Lettuce和Jedis)
- 提供了RedisTemplate统一API来操作Redis
- 支持Redis的发布订阅模型
- 支持Redis哨兵和Redis集群
- 支持基于Lettuce的响应式编程
- 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
- 支持基于Redis的JDKCollection实现
SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:
API | 返回值类型 | 说明 |
---|---|---|
redisTemplate.opsForValue() | ValueOperations | 用来操作String类型的数据 |
redisTemplate.opsForHash() | HashOperations | 操作Hash类型数据 |
redisTemplate.opsForList() | ListOperations | 操作List类型数据 |
redisTemplate.opsForSet() | SetOperations | 操作Set类型数据 |
redisTemplate.opsForZSet() | ZSetOperations | 操作SortedSet类型数据 |
redisTemplate | 通用的命令 |
这些方法可以向redis中存储各种类型的数据,包括简单类型和引用类型,如果想把引用数据类型存入redis中,默认要先进行序列化,然后将序列化之后的字符串存入redis中。但是通过这种方法存入的数据可读性较差。
StringRedisTemplate类
使用这个工具类只能存入string类型的key和value,如果想要存对象,需要把对象先序列化成JSON字符串,再存入。
@Test
void testUser() {
//创建对象
User user = new User("张三", 21);
//手动将对象序列化为json字符串
String jsonString = JSON.toJSONString(user);
//写入数据
stringRedisTemplate.opsForValue().set("user:200",jsonString);
//获取数据
String user200 = stringRedisTemplate.opsForValue().get("user:200");
//反序列化
User parseObject = JSON.parseObject(user200, User.class);
//打印输出
System.out.println(parseObject);
}
这里使用的JSON工具类是FASTJOSN2 (待续)