Redis(Remote Dictionary Server)是一个开源的、基于内存的高性能键值存储系统。它支持多种数据结构(如字符串、哈希、列表、集合、有序集合等),并提供了丰富的操作命令,可以满足各种场景下的数据存储和处理需求。
Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样:
通用指令是部分数据类型的,都可以使用的指令,常见的有:
192.168.2.4:0>KEYS *
1) "NAME"
2) "AGE"
# 查询以a开头的key
192.168.2.4:0>KEYS A*
1) "AGE"
在生产环境下,不推荐使用keys 命令,因为这个命令在key过多的情况下,效率不高
192.168.2.4:0>DEL NAME #删除单个
"1" #成功删除1个
192.168.2.4:0>MSET k1 v1 k2 v2 k3 v3 #批量添加数据
"OK"
192.168.2.4:0>del k1 k2 k3 k4
"3" #此处返回的是成功删除的key,由于redis中只有k1,k2,k3 所以只成功删除3个,最终返回
192.168.2.4:0>exists AGE
"1" #存在
192.168.2.4:0>exists age
"0" #不存在
192.168.2.4:0>expire AGE 10
"1"
192.168.2.4:0>ttl AGE
"6"
192.168.2.4:0>ttl AGE
"4"
192.168.2.4:0>ttl AGE
"4"
192.168.2.4:0>ttl AGE
"3"
192.168.2.4:0>ttl AGE
"2"
192.168.2.4:0>ttl AGE
"2"
192.168.2.4:0>ttl AGE
"1"
192.168.2.4:0>ttl AGE
"0"
192.168.2.4:0>ttl AGE
"-2"
192.168.2.4:0>ttl AGE
"-2"
192.168.2.4:0>ttl AGE
"-2" #当这个key过期了,那么此时查询出来就是-2
192.168.2.4:0>set age 10 #如果没有设置过期时间
"OK"
192.168.2.4:0>ttl age
"-1" # ttl的返回值就是-1
String类型,也就是字符串类型,是Redis中最简单的存储类型。其value是字符串,不过根据字符串的格式不同,又可以分为3类:
String的常见命令有:
192.168.2.4:0>set name zhangsan //原来不存在
"OK"
192.168.2.4:0>get name
"zhangsan"
192.168.2.4:0>set name lisi //原来存在,就是修改
"OK"
192.168.2.4:0>get name
"lisi"
192.168.2.4:0>MSET k1 v1 k2 v2 k3 v3
"OK"
192.168.2.4:0>MGET k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
192.168.2.4:0>incr age //增加1
"11"
192.168.2.4:0>get age
"11"
192.168.2.4:0>incrby age 2 //一次增加2
"13"
192.168.2.4:0>incrby age -1 //也可以增加负数,相当于减
"12"
192.168.2.4:0>decr age //相当于 incr 负数,减少正常用法
"11"
192.168.2.4:0>setnx name wangwu //如果key不存在,则添加成功
"0" //name 存在,所以操作失败
192.168.2.4:0>set name1 wangwu
"OK" //name1 不存在,所以操作成功
192.168.2.4:0>setex name 10 wangwu // 执行 SETEx 命令将会覆盖原有的值,并更新其过期时间。如果指定的键名不存在,则会创建一个新的键值对。
"OK"
192.168.2.4:0>ttl name
"4"
192.168.2.4:0>ttl name
"3"
Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。
String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便:
KEY | VALUE |
test:user:1 | {name:"zhangsan",age:18} |
test:user:2 | {name:"lisi",age:30} |
Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:
KEY | VALUE | |
field | value | |
test:user:1 | name | zhangsan |
age | 18 | |
test:user:2 | name | lisi |
age | 30 |
Hash类型的常见命令 :
192.168.2.4:0>Hset test:user:3 name wangwu //大key是 test:user:3 小key是name,小value是Lucy
"1"
192.168.2.4:0>Hset test:user:3 age 21 // 如果操作不存在的数据,则是新增
"1"
192.168.2.4:0>Hset test:user:3 age 17 //如果操作存在的数据,则是修改
"0"
192.168.2.4:0>Hget test:user:3 name
"wangwu"
192.168.2.4:0>Hget test:user:3 age
"17"
192.168.2.4:0>HMSET test:user:4 name hanmeimei
"OK"
192.168.2.4:0>HMSET test:user:4 name libai age 20 sex man
"OK"
192.168.2.4:0>HMGET test:user:4 name age sex
1) "libai"
2) "20"
3) "man"
192.168.2.4:0>HGETALL test:user:4
1) "name"
2) "libai"
3) "age"
4) "20"
5) "sex"
6) "man"
192.168.2.4:0>HKEYS test:user:4
1) "name"
2) "age"
3) "sex"
192.168.2.4:0>HVALS test:user:4
1) "libai"
2) "20"
3) "man"
192.168.2.4:0>HINCRBY test:user:4 age 2
"22"
192.168.2.4:0>HVALS test:user:4
1) "libai"
2) "22"
3) "man"
192.168.2.4:0>HINCRBY test:user:4 age -2
"20"
192.168.2.4:0>
192.168.2.4:0>HSETNX test:user:4 sex woman
"0" // 已经存在,操作失败
192.168.2.4:0>HSETNX test:user:5 sex woman
"1"
192.168.2.4:0>HGETALL test:user:3
1) "name"
2) "wangwu"
3) "age"
4) "17"
192.168.2.4:0>HSETNX test:user:3 sex woman
"1"
192.168.2.4:0>HGETALL test:user:3
1) "name"
2) "wangwu"
3) "age"
4) "17"
5) "sex"
6) "woman"
Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。
特征也与LinkedList类似:
常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。
List的常见命令有:
192.168.2.4:0>LPUSH users 1 2 3
"3"
192.168.2.4:0>RPUSH users 4 5 6
"6"
192.168.2.4:0>lpop users
"3"
192.168.2.4:0>rpop users
"6"
192.168.2.4:0>lrange users 1 2
1) "1"
2) "4"
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中的所有元素
SINTER key1 key2 ... :求key1与key2的交集
SDIFF key1 key2 ... :求key1与key2的差集
SUNION key1 key2 ..:求key1和key2的并集
Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表。
SortedSet具备下列特性:
因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。
SortedSet的常见命令有:
注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可,例如: