key操作
keys * # 查看所有的key
exists key # 判断当前key是否存在,存在返回1 不存在返回0
move key 1 # move切换,将选中key切换到其他数据库
clear # 清屏
set key value # 设置key value
get key # 获取key 的value
expire key 10(时间 秒为单位) # 设置key的过期时间,单位是S
ttl key # 查看当前key的剩余时间 过期后会删除 删除后显示为-2
type key # 查看当前key的类型 字符串为string
String(字符串)
-
基础操作
set key value # 设置值,存在覆盖 mset key value [key value ...... ]# 创建多个值 get key # 获得值,不存在报错 mget key [key ... ]# 获取多个值 keys * # 查看所有的key(key有多种类型) exists key # 判断某一个key是否存在 存在为1 不存在为0 append key value # 往该key中添加字符串,如果key不存在,就创建key 相当于setkey strlen key # 获取字符串的长度(该key必须是string类型)
-
增减指定步长
incr key # 自增1 注意:当该key的值不是数字的时候无法自增 decr key # 自减1 同上 incrby key int(数字类型 步长) # 可设置步长,指定增量 decrby key int # 设置步长,指定减量
-
字符串范围 range
getrange key start(数字 开始位置) end(数字 结束位置) # 截取字符串[start,end] 是闭区间 getrange key 0 -1 # 获取全部的字符串 和 get key是一样的
-
替换
setrange key offset(int 数字 从哪个位置开始) value(替换为什么) # 替换指定位置开始的字符串
-
setex(set with expire)设定到期,setnx(set if not exist) 不存在在设置(分布式锁中常常会用)
setex key seconds(int 数字) value # 设置key的值为value,并且seconds秒后到期也就是被删除 setnx key value # 如果key不存在,则创建,如果存在则创建失败 msetnx key value[ key value...] # 原子性操作,要么一起成功,要么一起失败,所有的key必须都不存在才可以创建成功
-
对象
set user:{id} {name:zhangsan,age:16} # 设置一个user:1对象 值为json字符串来保存一个对象 # 这里的key是一个巧妙的设计
-
getset 先get然后在set
getset key value # 返回该key的value,如果不存在则返回nil,如果存在值,则获取原来的值,并设置新的值
计数器、统计多单位数量、粉丝数、对象缓存
List(列表)
-
创建list
lpush key element(元素)[element.....]#将一个值或者多个值,插入到列表头部(左) 列表不存在则创建 rpush key element [element....]# 插入到列表尾部(右),不存在则创建
-
删除
lpop key(list类型) # 移出列表的第一个元素( 左 头部) rpop key # 移出列表的最后一个元素(右 尾部)
-
查询
lrange key(list类型) key start top # 获取list中的值 0 -1 是取出所有 [start top] 闭区间 lindex key index(int 数字) # 通过下标获取list中某一个值
-
llen返回列表长度
-
移除指定的值
lrem key count(int 数字) element # 移出列表中指定个数的指定元素(element),精确匹配,从头部(左边开始移除)
-
trim 切片(原list上)
ltrim key start stop #通过下标对list进行切片,会改变原列表,只有区间内的保留
-
rpoplpush
rpoplpush source(来源) destination(目的地) # 移除列表中的最后一个元素,将他移动到新的列表中的头部(左边),如果目标列表不存在则会创建,
-
更新
lset key index(int) element # 将该列表中的index索引,替换为element设置的值,如果不存在列表则会报错,如果不存在该索引也会报错 索引为从0开始
-
linsert 将某个具体的value插入到列表中某个元素的前面或者后面
linsert key befor(前面)|(或者)after(后面) element(就好像value 元素的意思) lpush 头部插入 rpush 尾部插入 linsert 具体元素中间插入
消息排列 消息队列(Lpush Rpop) 栈 (Lpush Lpop)
Set(集合)
set中的值是不能重复的,集合中的值是乱序的
命令基本上都是s开头的
-
增加
sadd key member [member(成员) ....] # 向key这个set中插入值 如果存在会插入失败
-
查看
smembers key # 查看这个集合中的所有成员(是指定集合) sismerber key member # 查看这个集合中有没有这个值
-
获取集合中的元素个数
scard key # 查看这个集合中的成员个数
-
移出set集合中指定的元素
srem key member [member.... ]# 移出集合中的指定元素 移出多个成员的时候 如果移出了一个不存在的成员不报错,应该就是跳过
-
随机
mrandmember key [count](加上就是随机取出多个不加就是随机取出一个) # 随机取出一个或者多个成员 spop key [count](同上) # 随机弹出一个或者多个成员 key是集合
-
移动
smove source(成员的来源) destination(成员的去处) member(成员) # 将一个指定的成员,移动到另一个set集合中 smove myset myset2 "hello" # 这两个成员必须是同一个库中的
-
交集 并集 差集
共同关注(交集) 等
sdiff key key key [key].... # 求多个集合的差集(就是去掉相同的 是第一个集合与其他集合的差集) sinter key key [key]... # 求多个集合的交集(显示的成员存在于所有查询的集合中) sunion key key [key]# 求多个集合的并集(就是全部加起来)
Hash(哈希)
Map集合,key-map! 这个值是一个map集合!本质和String类型没有太大区别,keys一个key-value
hset key field value [field value] # 增加一个具体的field-value field是该value的域
hget key field # 通过该hash中的域field来获取对应的value
hmset key filed value [field value] # 与hset一样 hset不加m也可以添多个
hget key field [filed] # 获取hash中的多个域对应的值value
hgetall key # 查看hash中的所有的数据 显示是以 field-value形式显示的
hdel key field [field] # 删除hash指定的域field对应的值value也就消失了
hexists key field # 判断hash中指定的域是否存在 存在返回1 不存在返回0
hkeys key # 获取hash中的所有域
hvalue key # 获取hash中的所有value
hincrby key field increment(数量) # hash对应域对应值的增量 注意!该值一定要为数字 当incrment为负数的时候表示,减少
hsetnx key field value # 如果不存在可以设置 如果存在则不变动沿用之前的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QlLUGjCF-1589947467126)(assets/1589296735413.png)]
hash用来存储变更的数据 user name age 尤其是用户信息之类的,hash更适合对象的存储,String更适合字符串存储
hset user 1 {name:zhangsan,age:16} # 设置一个user id对象 值为json字符串来保存一个对象
比set user:1 {name:zhangsan,age:16}更合适一些
Zset(有序集合)
在set的基础上,增加了一个值,一般都设置为数字,可以用来进行大小排列等
-
增加
zadd key score(分数) member [score member] # 往zset中加入成绩与其对应的成员 成绩可以是浮点型和整形 如果添加成员的时候成员存在那么可以更新其成绩
-
查询
zrange key start stop [WITHSCORES](加上那么查询时会显示对应的成绩) # 返回指定区间内的成员 1表示第一个 2是第二个... -1是最后一个 -2是倒数第二个... zcard key # 获取zset中的member个数 zcount key min max # 获取指定区间内的成员数量
-
排序
zrangebyscore key min max [WITHSCORES] # 按照zset的成绩进行从小到大的展示 -inf 表示最小值 +inf 表示最大值 ZRANGEBYSCORE salary -inf 2500 withscores # 展示工资小于2500员工的升序排列 zrevrange key start stop [WITHSCORES] # 从大到小进行排列
-
弹出
zrem key member [ke memebr] # 移出zset中的指定成员 不能通过成绩(score) 来弹出
zset排序,同时去掉重复成员 存储班级成绩表,工资表等
普通消息 1 ,重要消息 2,带权重进行判断!
排行榜应用实现,去TOP N测试
Geospatial地理位置
应用场景:
朋友的定位,附近的人,打车距离计算等等
官方文档中暂时只有六个命令:
-
GEOADD
-
GEODIST
-
GEOHASH
-
GEOPOS
-
GEORADIUS
-
GEORADIUSBYMEMBER
-
添加地理位置
geoadd key longitude(经度) latitude(纬度) member [....] # 注意:两极无法直接添加,一般使用时通过程序直接一次性导入数据,有效的经度从-180度到180度。有效的纬度从-85.05度到85.05,当坐标位置超出上述指定范围时抛出异常 geoadd china:city 116.40 39.90 beijing
-
获得当前定位:一定是一个坐标值!
geopos key member [member] # 查询出要查询的成员的经纬度
-
获取两成员之间的距离
geodist key member1 member2 [m|km|ft|mi] # m:米 km:千米 mi:英里 ft:英尺 默认为米 存在少许误差 GEODIST china:city beijing chongqi km # 查看重庆到北京的直线距离 "1464.0708"
-
以给定经纬度为中心,查找某一半径内的geospatial内的成员
georadius key longitude(经度) latitude(纬度) radius m|km|ft|mi [withcoord](显示坐标坐标) [withdist](显示两者之间的距离) [count int](限制查找出的结果数量) [....] georadius china:city 110 30 500 km withcood count 10
应用场景:我附近的人(获得所有附近的人的地址,定位)通过半径来查询
-
找出指定成员周围(给出的半径)的其他成员
georadiusbymember key member radius(半径) m|km|ft|mi [withcoord] [count int] [....] georadiusbymember china:city beijing 1000 km withdist
-
返回一个或者多个位置元素的geohash表示
该命令将返回11个字符串的geohash字符串
geohash key meber [meber ...] # 将二维的经纬度转换成一维的字符串,如果两个字符串越接近,那么距离越接近 geohash china:city beijing chongqi "wx4fbxxfke0" "wm5xzrybty0"
geo的底层实现原理其实就是Zset 可以使用Zset命令来操作geo
zrange china:city 0 -1 # 显示全部成员
"chongqi"
"beijing"
"shanghai"
zrem china:city beijing # 移出指定成员
等等Zset操作
Hyoerloglog
基数(不重复的元素)
{1,3,5,7,8,6,6} 的基数为6,可以接受大数据量是产生的误差
优点:占用的内存是固定的,2^64不同的元素的基数,只要12KB内存,如果要从内存角度来比较的话Hyperloglog是首选
网页的UV(一个人访问一个网站多次,但是还是记做一个人!)
传统的方式:set保存用户的id,然后就可以统计set中的元素数量作为标准判断!
这个方式如果保存大量的用户id,就会比较麻烦~我们的目的是为了计数,而不是保存用户id;
Hyperloglog在大量数据的时候会产生0.81%的错误率!统计UV任务,可以忽略不计的!
-
创建
pfadd key element [element...] # 创建可加入重复的element
-
统计元素的基数数量
pfcount key [key ...] # 可以统计多个 注意统计基数时,对于重复的element不会重复记录只会统计一次 比如: pfadd mykey 1 2 3 4 4 5 pfadd mykey2 6 6 6 6 pfcount mykey (integer) 5 pfcount mykey mykey (integer) 6 # 将两个key求并集然后在统计不重复的element
-
合并多组
pfmerge destkey(合并后的) sourcekey [sourcekey ...] # 是并集 pfmerge mykey3 myke myke2
如果可以允许容错,那么一定可以使用Hyperloglog(占用内存非常小)
如果不能容错,那就用set或者自己的数据类型即可
Bitmap
位存储
应用场景:统计用户信息,活跃|不活跃 登录|未登录 打卡|未打卡 只有两种状态的(占用内存非常小)
Bitmap位图,数据结构都是操作二级制位来进行记录,就只有0和1两个状态!
setbit key offset value # 加入 不存在则创建
setbit sign 1 1 # 周一 打卡(打卡为1 不打卡为0)
setbit sign 2 0 # 周二 未打卡
setbit sign 3 1
setbit sign 4 0
setbit sign 5 0
setbit sign 6 1
setbit sign 7 1
getbit key offset # 查询 加入时设置的value
getbit sign 6
(integer) 1
getbit sign 2
(integer) 0
bitcount key [start end](可以指定范围) # 统计1的数量!!!只会统计1
bitcount sign # 统计这周的打卡记录
(integer) 4