Redis常用命令
1. 启动、重启、停止、查看状态命令
systemctl start redis
systemctl restart redis
systemctl stop redis
systemctl status redis
# 指定配置文件启动redis
redis-server redis-conf
2.关闭Redis
redis-cli shutdown
3.连接Redis
redis-cli
4.远程连接Redis
redis-cli -h ip地址 -p 6379 redis无配置密码情况下
redis-cli -h ip地址 -p 6379 -a redis配置密码 redis有配置密码情况下
5.退出连接
exit
6.查询所有key
keys *
7.判断key是否存在
exists key
8.根据key设置过期时间
expire key time(单位是秒)
9.查看当前key的剩余过期时间
tll key
10.查看当前key的类型
type key
11. 删除一个或者多个key
del key ....
Redis的8中基本类型
1.String(字符串)
1.插入
set key string #插入string无时间限制
setex key time string #(set with expire)插入并设置有效时间为time 单位是表
setnx key string # (set if not exist) 先判断是否存在,不存在在
插入 经常使用在分布式锁中
2.字符拼接(后缀)如果不存在相当于set
append key string
3.查询字符长度
strlen key
4.自增(数据格式)
incr key (自增1)
incr key 10 #自增10
5.自减
decr key (自减1)
decr key 10 #自减10
6.字符串范围
getrange key 0 3 (截取下标0到3的数据)
getrange key 0 -1 #截取全部,相当于get
7.替换
setrange key 1 xx (替换下标从1开始的2个字符,xx多长替换多少个字符)
8.批量插入
mset k1 v1 k2 v2 k3 v3
9.批量查询
mget k1 k2 k3
10.先查询后插入
getset k1 v2 #查询k1的值,为空返回nil 并把k1的值改成v2
String的使用场景:value除了是字符串以外还可以是数字
- 计数器
- 统计多单位的数量
- 粉丝数
- 对象缓存储存
2.List
基本的数据类型,列表
在Redis中可以把list用作栈、队列、阻塞队列。
list命令多数以l开头。
1.插入
lpush key v1 v2 v3 #将一个值或者多个值,
插入到列表的头部 (左边加下标都是0)
127.0.0.1:6379> lpush list v1 v2 v3
(integer) 3
rpush key right #将一个值或者多个值,插入到列表的尾部
127.0.0.1:6379> rpush list v4 v5
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "v3"
2) "v2"
3) "v1"
4) "v4"
5) "v5"
2.查询
lrange key 0 -1 #查询全部
lrange key 0 1 #查询区间内的值 结果为v3 v2
3.移除
#移除并返回第一个元素 及下标为0的
127.0.0.1:6379> lpop key
"v3"
#移除并返回最后一个
127.0.0.1:6379> rpop key
"v5"
#移除集合中指定个数的value,精确匹配
lrem key 1 v2 移除一个值为v2的值
lrem key 2 v3 移除两个值为v3的值
4.索引:Lindex 命令用于通过索引获取列表中的元素。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素
lindex list 1
5.长度 Llen
127.0.0.1:6379> llen list
(integer) 3
6.trim 截断, 通过下标截取指定长度,这个list已经被破坏了,截断之后只剩下截断后的元素
127.0.0.1:6379>ltrim list 1 2
ok
7.rpoplpush :移除列表的最后一个元素,将他移动到新的列表中。
127.0.0.1:6379>ltrim list 1 2
ok
127.0.0.1:6379> lrange list 0 -1
1) "v1"
2) "v4"
8.lset:将列表中指定下标的值替换为另一个值,更新操作
127.0.0.1:6379> lrange list 0 -1
1) "v1"
2) "v4"
127.0.0.1:6379> exists list
(integer) 1
127.0.0.1:6379> lset list 0 v0
OK
127.0.0.1:6379> lrange list 0 -1
1) "v0"
2) "v4"
9.linsert:将某个具体的value插入到列表中某个元素的前面或者后面
127.0.0.1:6379> lrange list 0 -1
1) "v0"
2) "v4"
127.0.0.1:6379> linsert list after v0 v1
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "v0"
2) "v1"
3) "v4"
127.0.0.1:6379> linsert list before v4 v3
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "v0"
2) "v1"
3) "v3"
4) "v4"
127.0.0.1:6379>
小结
- list实际上是一个链表,前后都可以插入
- 如果key不存在,创建新的链表
- 如果移除了所有的值,空链表,也代表不存在
- 在两边插入获取改动值,效率最高
3、Set(集合)
1.sadd: 集合中添加元素
127.0.0.1:6379> sadd set set1
(integer) 1
127.0.0.1:6379> sadd set set2 set3
(integer) 2
2.smembers: 查询所有值
127.0.0.1:6379> smembers set
1) "set3"
2) "set2"
3) "set1"
3.sismember:判断某个值是否存在
127.0.0.1:6379> sismember set set4
(integer) 0
127.0.0.1:6379> sismember set set1
(integer) 1
4.scard:获取集合中的个数(长度)
127.0.0.1:6379> scard set
(integer) 3
5.srem:移除一个或多个元素
127.0.0.1:6379> srem set set1
(integer) 1
127.0.0.1:6379> smembers set
1) "set3"
2) "set2"
127.0.0.1:6379> sadd set set1 set4 set5
(integer) 3
127.0.0.1:6379> srem set set4 set5
(integer) 2
6.srandmember:随机抽取一个或指定个数的值
127.0.0.1:6379> srandmember set
"set2"
127.0.0.1:6379> smembers set
1) "set2"
2) "set3"
3) "set1"
127.0.0.1:6379> srandmember set 2
1) "set3"
2) "set2"
7.spop:随机删除一个或指定个数的元素
127.0.0.1:6379> spop set
"set2"
127.0.0.1:6379> smembers set
1) "set3"
2) "set1"
127.0.0.1:6379> spop set 2
8.smove:把指定的值,移动到另一个集合中
127.0.0.1:6379> smembers set
1) "set3"
2) "set1"
127.0.0.1:6379> smove set set1 set3
(integer) 1
127.0.0.1:6379> smembers set1
1) "set3"
127.0.0.1:6379> smembers set
1) "set1"
9.sdiff:比较两个或多个集合与第一个集合的差集
127.0.0.1:6379> smembers set1
1) "set3"
127.0.0.1:6379> smembers set
1) "set1"
127.0.0.1:6379> sdiff set set1
1) "set1"
127.0.0.1:6379> sadd set2 a b
(integer) 2
127.0.0.1:6379> sdiff set2 set1 set
1) "a"
2) "b"
4、Hash(哈希)
也是Key-value形式的,但是value是一个map。
1.hset:添加一个或多个key-value
127.0.0.1:6379> hset myhash f fancg
(integer) 1
127.0.0.1:6379> hset myhash f2 fancg w wangyang
(integer) 2
2.hget:查询一个
127.0.0.1:6379> hget myhash f
"fancg"
3.hmget:查询多个
127.0.0.1:6379> hmget myhash f f1 w
1) "fancg"
2) (nil)
3) "wangyang"
4.hgetall:查询全部
127.0.0.1:6379> hgetall myhash
1) "f"
2) "fancg"
3) "f2"
4) "fancg"
5) "w"
6) "wangyang"
5.hdel: 删除一个或者多个
127.0.0.1:6379> hdel myhash f2 w
(integer) 2
6.hlen: 获取hash长度
127.0.0.1:6379> hlen myhash
(integer) 4
7.hexistes: 判断指定的key是否存在
127.0.0.1:6379> hexists myhash f3
(integer) 1
127.0.0.1:6379> hexists myhash ff
(integer) 0
8.hkeys: 查询所有的key
127.0.0.1:6379> hkeys myhash
1) "f"
2) "f2"
3) "f3"
4) "f4"
9.hincrby: 指定增量
127.0.0.1:6379> hset myhash f5 2
(integer) 1
127.0.0.1:6379> hincrby myhash f5 2
(integer) 4
127.0.0.1:6379> hincrby myhash f5 3
(integer) 7
127.0.0.1:6379> hincrby myhash f5 -1
(integer) 6
9.hincrby: 指定增量
127.0.0.1:6379> hset myhash f5 2
(integer) 1
127.0.0.1:6379> hincrby myhash f5 2
(integer) 4
127.0.0.1:6379> hincrby myhash f5 3
(integer) 7
127.0.0.1:6379> hincrby myhash f5 -1
(integer) 6
10.hsetnx: 如果不存在则可以设置,存在不能设置
127.0.0.1:6379> hsetnx myhash f1 wangy
(integer) 1
127.0.0.1:6379> hsetnx myhash f1 wangy
(integer) 0
127.0.0.1:6379> hsetnx myhash f1 wf
(integer) 0
5、zset(有序集合)
1.插入一个或者多个值
127.0.0.1:6379> zadd myzset 9 nine 4 four 5 five 1 one
(integer) 4
127.0.0.1:6379> zadd myzset 2 two
(integer) 1
2.zrange: 分页查询、查所有(默认从小到大key)
127.0.0.1:6379> zrange myzset 0 -1
1) "one"
2) "two"
3) "four"
4) "five"
5) "nine"
127.0.0.1:6379> zrange myzset 0 2
1) "one"
2) "two"
3) "four"
3.zrangebyscore: 从小到大线上所有
127.0.0.1:6379> zrangebyscore myzset -inf +inf
1) "one"
2) "two"
3) "four"
4) "five"
5) "nine"
4.zrevrange: 从大到小排序
127.0.0.1:6379> zrevrange myzset 0 -1
1) "nine"
2) "five"
3) "four"
4) "two"
5) "one"
5.zrangebyscore key -inf +inf withscores :查询key和value,key 从小到大排列
127.0.0.1:6379> zrangebyscore myzset -inf +inf withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "four"
6) "4"
7) "five"
8) "5"
9) "nine"
10) "9"
- zrangebyscore key -inf 5 withscores 查询key小于等于5的
127.0.0.1:6379> zrangebyscore myzset -inf 5 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "four"
6) "4"
7) "five"
8) "5"
7.zrem: 移除特定元素
127.0.0.1:6379> zrem myzset five
(integer) 1
127.0.0.1:6379> zrange myzset 0 -1
1) "one"
2) "two"
3) "four"
4) "nine"
8.zcard: 获取有序集合的个数
127.0.0.1:6379> zcard myzset
(integer) 4
9.zcount: 获取指定区间的元素个数
127.0.0.1:6379> zcount myzset 0 2
(integer) 2
127.0.0.1:6379> zcount myzset 5 9
(integer) 1
127.0.0.1:6379>
6、geospatial(地理空间)
Redis在3.2推出Geo类型,该功能可以推算出地理位置信息,两地之间的距离。
- geoadd: 添加地理位置
规则:两级无法直接添加,一般会下载城市数据,直接通过Java程序一次性导入。有效的经度从-180度和180度。有效的维度从-85.05112878度到85.05112878度。当坐标位置超出指定范围时,该命令将会返回一个错误。
127.0.0.1:6379> geoadd beijing 181 81
(error) ERR wrong number of arguments for 'geoadd' command
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai 106.50 29.53 chongqing
(integer) 2
127.0.0.1:6379> geoadd china:city 114.05 22.52 shengzhen 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 3
- geopos: 获取当前定位坐标值
127.0.0.1:6379> geopos china:city xian
1) 1) "108.96000176668167114"
2) "34.25999964418929977"
- geodist: 获取两个位置之间的距离
单位:
- m 表示单位为米
- km 表示单位为千米
- mi 表示单位为英里。
- ft 表示单位为英尺
如果不指定单位参数,默认单位是米
127.0.0.1:6379> geodist china:city beijing xian
"910056.5237"
127.0.0.1:6379> geodist china:city beijing xian km
"910.0565"
- georedius: 以给定的经纬度为中心,找出某一半径内的元素
- 以110,30这个点为中心,寻找方圆1000Kmd 城市
127.0.0.1:6379> georadius china:city 110 30 1000 km
1) "chongqing"
2) "xian"
3) "shengzhen"
4) "hangzhou"
- 显示城市的定位信息
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord
1) 1) "chongqing"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "xian"
2) 1) "108.96000176668167114"
2) "34.25999964418929977"
- 显示到中心点的距离
127.0.0.1:6379> georadius china:city 110 30 500 km withdist
1) 1) "chongqing"
2) "341.9374"
2) 1) "xian"
2) "483.8340"
- 显示到中心点的距离、坐标并指定个数的城市
127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 1
1) 1) "chongqing"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
127.0.0.1:6379> georadius china:city 110 30 500 km withdish withcoord count 2
(error) ERR syntax error
127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 2
1) 1) "chongqing"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "xian"
2) "483.8340"
3) 1) "108.96000176668167114"
2) "34.25999964418929977"
- georadiusbymember :找出指定元素周围的其他元素
127.0.0.1:6379> georadiusbymember china:city beijing 1000 km
1) "beijing"
2) "xian"
- geo底层实现原理其实就是zset,可以使用zset命令操作geo
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "xian"
3) "shengzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
7、hyperloglog(超级日志)
基数:数学上集合的元素个数,是不能重复的。
Redis2.8.9版本更新了hyperloglog数据结构,是基于基数统计的算法。
hyperloglog的优点是占用内存小,并且是固定的。储存2^64个不同元素的基数,只需要12KB的空间。但是也可能有0.81%的错误率。
127.0.0.1:6379> pfadd pf a a b b c d e f g n m
(integer) 1
127.0.0.1:6379> pfcount pf
(integer) 9
127.0.0.1:6379> pfadd pf2 m n y i o p
(integer) 1
127.0.0.1:6379> pfcount pf2
(integer) 6
127.0.0.1:6379> pfmerge pf3 pf pf2
OK
127.0.0.1:6379> pfcount pf3
(integer) 13
8、bitmap(位图)
bitmap就是通过最小的单位bit来进行0或者1的设置,表示某个元素对应的值或者状态,一个bit的值,或者是0,或者是1;也就是说一个bit能存储的最多信息是2。
bitmap 常用于统计用户 信息比如活跃粉丝数、登录和未登录、是否打开灯。
127.0.0.1:6379> setbit sign 0 1 # 周一打卡了(integer) 0
127.0.0.1:6379> setbit sign 1 0 # 周二未打卡(integer) 0
127.0.0.1:6379> setbit sign 2 0 # 周三未打卡(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
查看某一天是否打卡
127.0.0.1:6379> GETBIT sign 3
(integer) 1
127.0.0.1:6379> GETBIT sign 6
(integer) 0
统计打卡的天数
127.0.0.1:6379> BITCOUNT sign
(integer) 4