Redis的常用命令
一、关于通用的命令
-
redis-cli -p 6379 启动redis客户端连接服务端
redis的服务端默认端口为6379
- keys * 查看当前数据库内所有key
注意,redis一共有16个数据库,默认使用第下标为0的数据
- set key value 设置key-value键值对
-
get key 获取key对应的键值对
如果key不存在,返回null
- flushdb 清空当前数据库内的所有keys
- flushall 清空所有数据库内的所有keys
-
exists key 查询数据库中是否有该key
有的话返回1,没有返回0
-
expire key second 指定key在几秒后过期
如果key存在返回1表示生效,否则返回0
-
ttl key 查看key什么时候会过期
为-1表示永不过期,为-2表示已经过期
- type key 查询key对应value的类型
-
move key db 将key移动到指定数据库中
注意,在redis中是不区分大小写的
二、关于string类型的操作命令
-
append key value 在指定的key后面追加新内容
如果key不存在,则会创建一个key-value出来
- strlen key 查看当前key的长度
- incr key 对指定key进行加1操作
-
decr key 对指定key进行减一操作
如果此时key不存在,会自动新建,默认初始值为0
- incrby key num 对指定key进行增加指定步长操作
- decrby key num 对指定key进行减少指定步长操作
- 对于字符串范围(Range)的修改
-- getrange key startIndex endIndex 查询指定key范围内的value值
当endindex为-1时,相当于是查询整个字符串的内容
-- setrange key startIndex value 从指定index开始,替换掉value中对应的内容
如果index超过了当前value的最长长度时,会先用\x00替代中间每一个空白的vlue,再接上指定的value
-
setex key second value 新建一个key-value并指定过期时间
如果key已经存在,则覆盖原有的key
- setnx key value 如果指定的key不存在,则新建一对key-value
- mset key1 value1 key2 value2 ... 同时新建多对key-value
- mget key1 key2 ... 同时查询多个key对应的值
- msetnx key1 value1 key2 value2 同时新建多对key-value,如果已存在key,则所有的设值无效
-
getset key value 如果get某个key的时候没有值,则会将新的value设值进去
如果有值的话,返回原有的值。这个方法有些类似于setnx key value,但是两个方法的返回值不同
三、关于list类型的操作命令
在redis当中,我们可以利用list来实现类似队列、栈等数据结构的效果
在redis中,所有的list操作都是以L(可以是小写)开头的
- 存值和取值
-- lpush key value 从左push值进去
-- lpup key 从左pop值出来
此时的存值取值相当于是栈,遵循先进后出的原则
-- rpush key value 从右边posh值进来
-- rpop key 从右边pop值出去
-- lrange key startIndex endIndex 查询指定集合中起始索引到结束索引中间的元素
可以通过lrange list 0 -1 来查询集合中的所有元素
-
lindex key index 获取list中指定索引的元素
如果不存在返回的值为null
-
lrem key num value 移除指定list中的n个value
比如list中有多个同名value,可以通过此操作删除相关的同名value
- ltrim key startIndex endIndex 移除掉除[startIndex , endIndex]之外的集合内其他元素
-
rpoplpush key targetkey 将列表中最后一个元素移动到指定的list中
如果targetKey不存在的话,则会新建一个
- lset key index value 给list集合指定index的值更新新的值,如果索引不存在,则报错
- linsert key BEFORE|AFTER value1 value2 在集合中指定value的后面或者前面插入一个新的值
总结:
1、 如果说,对于list先进行 lpush 、rpop,就相当于是队列;对list先进行lpush 、lpop的话,就相当于是栈
2、 如果list中没有其他元素的话,那么list会消失
四、关于set类型的操作命令
对于set的话,可以类比于java中的set,集合内的元素是不可以重复的
同时,和list相似,有关set的操作大部分都是以s开头的
-
sadd setname value 往set中存放元素
如果添加成功返回1,如果set中已有同名元素,返回0
- smembers setname 查询指定set中存在哪些元素
- sismember setname value 查询set中是否存在指定value
- scard setname 查询指定set中的元素个数
- srem setname value 移除set中的指定元素
-
srandmember setname [count] 随机从集合中取出n个元素
不指定count的话,默认为1
- spop setname 随机从set集合中取出一个元素
- smove set1 set2 value 将set1中的指定元素移动到set2中
- 交集 | 并集 | 差集
-- sdiff set1 set2 以set1为主查询与set2的差集
-- sunion set1 set2 查询set1和set2的并集
-- sinter set1 set2 查询set1于set2之间的交集
五、Hash(哈希)
相当于java中的hashMap
- hset mapName field value 设置map中字段的key-value
- hget mapName field 获取map中指定key的value
- hmset mapName field1 value1 field2 value2... 同时设置多个key-value
- hmget mapName field1 field2.. 同时获取多个key的值
-
hgetall mapName 获取该map中的所有元素
结果会以key-value的形式进行展示
- hdel mapName field 删除map中的指定key
- hlen mapName field 获取map中的元素个数
- hexists mapName field 判断map中是否存在某个key
- hkeys mapName 获取指定map中的所有key
- hvals mapName 获取指定map中的所有value
- hincrby mapName fieldname num 通过指定步长增加map中元素的值
- hsetnx mapName fieldname value如果map中不存在field则新增一对key-value
六、sorted set(有序集合)
zadd key score member... 添加(带比较标识)元素
zrangebyscore key min max [ withscores ] [ limit offset count ]
zrange key start stop [withscore]
同lrange相似,参数为 0 -1时,显示的是所有元素
zrem key member 删除有序集合中的指定元素
zcard key 获取有序集合中的元素个数
zcount key min max 获取有序集合中指定区间内的元素个数
127.0.0.1:6379> zrange myset 0 -1 withscores
1) "xiaoming"
2) "100"
3) "xiaozhi"
4) "150"
5) "xiaohong"
6) "200"
127.0.0.1:6379> zcount myset 0 150
(integer) 2 --由此可见,这个区间是闭区间的
-
zrevrangebyscore key max min [WITHSOCRES] [LIMIT OFFSET COUNT]
和正序排序相对应,该命令用于从大到小排序集合内元素
其实就是比zrangebyscore 多了个rev前缀
127.0.0.1:6379> zrevrangebyscore myset +inf -inf withscores
1) "xiaohong"
2) "200"
3) "xiaozhi"
4) "150"
5) "xiaoming"
6) "100"
七、特殊数据类型——Geos patial(地理位置)
- geoadd key longitude latitude member 添加地理坐标元素到set中
geoadd出来的其实是一个zset,可以通过type命令进行查看
-- longitude 表示经度
-- latitude 表示纬度
-- member 表示地理名称
geoadd china:city 117.956785 24.586803 xiamen
- geopop key member 获取指定对象的经纬度信息
127.0.0.1:6379> geopos china:city chongqin
1) "121.41009718179702759" -- 经度
2) "31.32469368754957628" -- 纬度
- geodist key mem1 mem2 [ 距离单位 ] 返回两个给定位置之间的距离
-- mi 表示英里
-- ft 表示英尺
127.0.0.1:6379> geodist china:city shanghai beijing m
"1056780.3732"
127.0.0.1:6379> geodist china:city shanghai beijing km -- 距离单位:千米
"1056.7804"
- georadius key longitude latitude radius m | km | ft | mi [withCoord] [withDist ]
[withHash] [Count count]
radius表示半径 withcoord 写上表示显示结果集元素中的经纬度 withDist 写上表示显示结果集中元素离中心点的距离 count 表示限制结果集的数量
127.0.0.1:6379> georadius china:city 117 30 1000 km withcoord withdist
1) 1) "xiamen"
2) "609.4620"
3) 1) "117.95678526163101196"
2) "24.58680411711188896"
2) 1) "chongqin"
2) "446.8803"
3) 1) "121.41009718179702759"
2) "31.32469368754957628"
3) 1) "shanghai"
2) "446.8803"
3) 1) "121.41009718179702759"
2) "31.32469368754957628"
127.0.0.1:6379> georadius china:city 117 30 1000 km withcoord withdist count 2
1) 1) "chongqin"
2) "446.8803"
3) 1) "121.41009718179702759"
2) "31.32469368754957628"
2) 1) "shanghai"
2) "446.8803"
3) 1) "121.41009718179702759"
2) "31.32469368754957628"
- georadiusbymember key member radius m | km | ft | mi [withCoord] [withDist ]
[withHash] [Count count] 寻找指定元素在指定半径中的其他元素
127.0.0.1:6379> georadiusbymember china:city xiamen 1000 km withdist
1) 1) "xiamen"
2) "0.0000"
2) 1) "chongqin"
2) "822.4983"
3) 1) "shanghai"
2) "822.4983"
- geohash key member 返回2维数据的11位1维字符串
八、特殊数据类型——Hyperloglog
Hyperloglog主要是用来做基数的运算的
什么是基数?
可以理解为是不重复的元素。比如有集合{ 1, 4, 5, 9, 4, 6} , 那么基数集就为{ 1, 4, 5, 9, 6} ,基数为5 。
基数估计就是在误差可接受的范围内,快速计算基数
hyperloglog计算有什么优点?
使用hyperloglog算法计算所占用的内存是固定的,约为 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。pfadd key elelment1 element2 ... 添加元素到key中
hyperloglog生成的数据类型是string
pfcount key 计算key中的元素个数
pfmerge targetKey sourceKey1 sourceKey2 ... 将多个key合并后的基数merge为新的key中
127.0.0.1:6379> pfadd myset a b c d e f g
(integer) 1
127.0.0.1:6379> pfadd myset2 c d e f g h i
(integer) 1
127.0.0.1:6379> pfcount myset
(integer) 7
127.0.0.1:6379> pfmerge myset3 myset myset2
OK
127.0.0.1:6379> pfcount myset3
(integer) 9
127.0.0.1:6379>
备注:使用hyperloglog计算出来的基数存在0.8%左右的误差,对于准确率不严格的需求来说,使用hyperloglog可以很好的实现去重的操作,可以用于计算当前在线的用户等等
九、Bitmaps
bitmaps主要是用于位运算,我们可以通过bitmaps做一些类似于统计在线人数等操作
- setbit key offset value 存储一个值,可以用于位运算
- getbit key offset 取出存储的值
- bigcount key 获取位的总值
127.0.0.1:6379> setbit user:20200804 1 1
(integer) 0
127.0.0.1:6379> setbit user:20200804 2 1
(integer) 0
127.0.0.1:6379> setbit user:20200804 6 1
(integer) 0
127.0.0.1:6379> setbit user:20200804 3 0
(integer) 0
127.0.0.1:6379> bitcount user:20200804
(integer) 3
我们可以通过类似上面的设计,来获取到某个日期中会员的登录总量,或者某个会员是否有登录