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即可,例如:
GEO就是Geolocation的简写形式,代表地理坐标。Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。常见的命令有:
- 43.139.59.28:0>GEOADD test1 13.361389 38.115556 zhangsan # 指定键名和经纬度坐标外,还需要提供相应的成员。每个地理位置需要对应一个成员。
- "1"
-
- 43.139.59.28:0>GEOADD test1 13.361389 38.115556 1 # 如果您不想指定成员,可以使用默认的成员标识符或者给每个地理位置指定一个具体的成员。
- "1"
- 43.139.59.28:0>GEOADD test1 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
- "2"
-
- 43.139.59.28:0>GEOPOS test1 Palermo Catania NonExisting
- 1) 1) "13.36138933897018433" # 从给定的 key 里返回所有指定名称(member)的位置(经度和纬度)
- 2) "38.11555639549629859"
-
- 2) 1) "15.08726745843887329"
- 2) "37.50266842333162032"
-
- 3) null # 不存在的返回 nil。
-
参数说明:
GEODIST key member1 member2 [m|km|ft|mi]
member1 member2 为两个地理位置。
最后一个距离单位参数说明:
- 43.139.59.28:0>GEODIST test1 Palermo Catania # geodist 用于返回两个给定位置之间的距离。
- "166274.1516"
-
- 43.139.59.28:0>GEODIST test1 Foo Bar
- null # 不存在返回null
参数:
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
参数说明:
- 43.139.59.28:0>GEORADIUS test1 15 37 200 km WITHDIST # 它的作用是从名为 test1 的地理空间索引中获取距离给定经度(15)和纬度(37)坐标200公里范围内的成员,并返回距离值。
- 1) 1) "1
- "
- 2) "190.4424"
-
- 2) 1) "Palermo"
- 2) "190.4424"
-
- 3) 1) "zhangsan"
- 2) "190.4424"
-
- 4) 1) "Catania"
- 2) "56.4413"
-
- GEORADIUS test1 15 37 200 km WITHDIST WITHCOORD # 它的作用是从名为 test1 的地理空间索引中获取距离给定经度(15)和纬度(37)坐标200公里范围内的成员,并返回距离值和相应的经纬度坐标。
- 1) 1) "1
- "
- 2) "190.4424"
- 3) 1) "13.36138933897018433"
- 2) "38.11555639549629859"
-
-
- 2) 1) "Palermo"
- 2) "190.4424"
- 3) 1) "13.36138933897018433"
- 2) "38.11555639549629859"
-
-
- 3) 1) "zhangsan"
- 2) "190.4424"
- 3) 1) "13.36138933897018433"
- 2) "38.11555639549629859"
-
-
- 4) 1) "Catania"
- 2) "56.4413"
- 3) 1) "15.08726745843887329"
- 2) "37.50266842333162032"
参数:
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
参数说明:
- 43.139.59.28:0>GEOADD test1 13.583333 37.316667 "Agrigento"
- "1"
- 43.139.59.28:0>GEORADIUSBYMEMBER test1 Agrigento 100 km # 它的作用是从名为 test1 的地理空间索引中获取与成员 Agrigento 距离不超过 100 公里的其他成员。
- 1) "Agrigento"
- 2) "1
- "
- 3) "Palermo"
- 4) "zhangsan"
- 43.139.59.28:0>GEOHASH test1 Palermo Catania # 它的作用是从名为 test1 的地理空间索引中获取多个成员的 Geohash 值。
- 1) "sqc8b49rny0"
- 2) "sqdtr74hyu0"