Redis(Remote Dictionary Server)是一个开源的、基于内存的高性能键值存储系统。它支持多种数据结构(如字符串、哈希、列表、集合、有序集合等),并提供了丰富的操作命令,可以满足各种场景下的数据存储和处理需求。
Redis数据结构
Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样:
Redis 通用命令
通用指令是部分数据类型的,都可以使用的指令,常见的有:
- KEYS:查看符合模板的所有key
- DEL:删除一个指定的key
- EXISTS:判断key是否存在
- EXPIRE:给一个key设置有效期,有效期到期时该key会被自动删除
- TTL:查看一个KEY的剩余有效期
KEYS
192.168.2.4:0>KEYS *
1) "NAME"
2) "AGE"
# 查询以a开头的key
192.168.2.4:0>KEYS A*
1) "AGE"
在生产环境下,不推荐使用keys 命令,因为这个命令在key过多的情况下,效率不高
DEL
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个,最终返回
EXISTS
192.168.2.4:0>exists AGE
"1" #存在
192.168.2.4:0>exists age
"0" #不存在
EXPIRE
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命令
String类型,也就是字符串类型,是Redis中最简单的存储类型。其value是字符串,不过根据字符串的格式不同,又可以分为3类:
- string:普通字符串
- int:整数类型,可以做自增.自减操作
- float:浮点类型,可以做自增.自减操作
String的常见命令有:
- SET:添加或者修改已经存在的一个String类型的键值对
- GET:根据key获取String类型的value
- MSET:批量添加多个String类型的键值对
- MGET:根据多个key获取多个String类型的value
- INCR:让一个整型的key自增1
- INCRBY:让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2
- DECY:让一个整型的将 key 中储存的数字值减一。
- INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
- SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行
- SETEX:添加一个String类型的键值对,并且指定有效期
SET 和GET
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"
MSET和MGET
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"
INCR和INCRBY和DECY
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"
SETNX
192.168.2.4:0>setnx name wangwu //如果key不存在,则添加成功
"0" //name 存在,所以操作失败
192.168.2.4:0>set name1 wangwu
"OK" //name1 不存在,所以操作成功
SETEX
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命令
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类型的常见命令 :
- 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:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
HSET和HGET
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"
HMSET和HMGET
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"
HGETALL
192.168.2.4:0>HGETALL test:user:4
1) "name"
2) "libai"
3) "age"
4) "20"
5) "sex"
6) "man"
HKEYS和HVALS
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"
HINCRBY
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>
HSETNX
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"
List命令
Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。
特征也与LinkedList类似:
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般
常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。
List的常见命令有:
- LPUSH key element ... :向列表左侧插入一个或多个元素
- LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil
- RPUSH key element ... :向列表右侧插入一个或多个元素
- RPOP key:移除并返回列表右侧的第一个元素
- LRANGE key star end:返回一段角标范围内的所有元素
- BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil
LPUSH和RPUSH
192.168.2.4:0>LPUSH users 1 2 3
"3"
192.168.2.4:0>RPUSH users 4 5 6
"6"
LPOP和RPOP
192.168.2.4:0>lpop users
"3"
192.168.2.4:0>rpop users
"6"
LRANGE
192.168.2.4:0>lrange users 1 2
1) "1"
2) "4"
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中的所有元素
-
SINTER key1 key2 ... :求key1与key2的交集
-
SDIFF key1 key2 ... :求key1与key2的差集
-
SUNION key1 key2 ..:求key1和key2的并集
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:按照score排序后,获取指定排名范围内的元素
- ZRANGEBYSCORE key min max:按照score排序后,获取指定score范围内的元素
- ZDIFF.ZINTER.ZUNION:求差集.交集.并集
注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可,例如:
- 升序获取sorted set 中的指定元素的排名:ZRANK key member
- 降序获取sorted set 中的指定元素的排名:ZREVRANK key memeber
GEO命令
GEO就是Geolocation的简写形式,代表地理坐标。Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。常见的命令有:
- GEOADD:添加一个地理空间信息,包含:经度(longitude)、纬度(latitude)、值(member)
- GEODIST:计算指定的两个点之间的距离并返回
- GEOHASH:将指定member的坐标转为hash字符串形式并返回
- GEOPOS:返回指定member的坐标
- GEORADIUS:指定圆心、半径,找到该圆内包含的所有member,并按照与圆心之间的距离排序后返回。6.以后已废弃
- GEORADIUSBYMEMBER:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
- GEOSEARCH:在指定范围内搜索member,并按照与指定点之间的距离排序后返回。范围可以是圆形或矩形。6.2.新功能
- GEOSEARCHSTORE:与GEOSEARCH功能一致,不过可以把结果存储到一个指定的key。 6.2.新功能
geoadd
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"
geopos
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
参数说明:
GEODIST key member1 member2 [m|km|ft|mi]
member1 member2 为两个地理位置。
最后一个距离单位参数说明:
- m :米,默认单位。
- km :千米。
- mi :英里。
- ft :英尺。
43.139.59.28:0>GEODIST test1 Palermo Catania # geodist 用于返回两个给定位置之间的距离。
"166274.1516"
43.139.59.28:0>GEODIST test1 Foo Bar
null # 不存在返回null
georadius
参数:
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
参数说明:
- m :米,默认单位。
- km :千米。
- mi :英里。
- ft :英尺。
- WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。
- WITHCOORD: 将位置元素的经度和纬度也一并返回。
- WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
- COUNT 限定返回的记录数。
- ASC: 查找结果根据距离从近到远排序。
- DESC: 查找结果根据从远到近排序。
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
参数:
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
参数说明:
- m :米,默认单位。
- km :千米。
- mi :英里。
- ft :英尺。
- WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。
- WITHCOORD: 将位置元素的经度和纬度也一并返回。
- WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
- COUNT 限定返回的记录数。
- ASC: 查找结果根据距离从近到远排序。
- DESC: 查找结果根据从远到近排序。
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"
geohash
43.139.59.28:0>GEOHASH test1 Palermo Catania # 它的作用是从名为 test1 的地理空间索引中获取多个成员的 Geohash 值。
1) "sqc8b49rny0"
2) "sqdtr74hyu0"