PS:redis不区分大小写命令,且会自动识别String,value值可以不加双引号
五大基本数据类型
一、String
#操作数据库
select 1 #进入编号为1的数据库,redis一共有16个数据库,编号从0~15
flushdb #清空数据库
flushall #清空所有数据库
move key1 1 #移动一个key到另一个数据库
#增、改
set key1 "hello" #设置指定的key
#查
get key1 #获得指定的key
keys * #获得所有的key
exists key1 #判断某一个key是否存在
#删
del key1 #删除指定的key
expire key1 10 #设置key的有效时间单位秒
ttl key1 #获取key的当前有效时间
type key1 #获取key的存储类型
append key1 ",redis" #追加字符串,如果key不存在,就相当于set key
strlen key1 #获取当前字符串长度
**************************************************************
incr key1 #自增1
decr key1 #自减1
incrby key1 10 #当前key值加上指定值
decrby key1 10 #当前key值减去指定值
getrange key1 0 3 #截取字符串[0,3]
getrange key1 0 -1 #获取全部字符串和 get key 是一样的
setrange key1 1 xx #替换指定位置开始的字符串
setex key1 10 "hello" #(set with expire)设置值和过期时间
setnx key1 "hello" #(set if not exist)如果key不存在则创建key并设值
mset k1 v1 k2 v2 k3 v3 #同时设置多个值
mget k1 k2 k3 #同时获取多个值
msetnx k1 v1 k4 v4 #如果不存在则创建多个对应的k-v对。msetnx是原子性操作,要么一起成功,要么一 起失败
#保存一个对象
set user:1 {name:zhangsan,age:3} #{xxx}为JSON格式的字符串
set user:1:age 18 #user:{id}:{filed} 设置id为1的user对象age为18
#组合语句
#先get再set
getset db "redis" #如果不存在值则返回null,如果存在则获取原来的值并设置新值(可用于更新)
String类似的使用场景:value除了是字符串还可以是数字
- 计数器
- 统计多单位的数量
- 粉丝数
- 对象缓存存储
二、List
再redis里,list可以玩成栈、队列、阻塞队列
所有的list命令都是L或R开头的
#增
lpush list1 one #将一个或多个值插入到列表头部(左)
rpush list1 one #将一个或多个值插入到列表尾部(右)
linsert list1 before(after) world other #将某个值插入到列表中某个值的前面或后面
#查
lrange list1 0 2 #获取指定范围的值
lrange list1 0 -1 #获取所有值
#删
lpop list1 #移除列表第一个元素(左)
rpop list1 #移除列表最后一个元素(右)
lpop(rpop) list1 2 #移除列表指定个数的元素
lrem list 1 one #移除list中指定个数的value,精确匹配,若数值为0则移除所有
#改
lset list1 0 item #将列表中指定下标的值替换为另一个值(更新),先判断该list是否存在,不存在就会报错,存在就会替换当前值
ltrim list 1 2 #通过下标截取指定长度的list
lindex list1 1 #通过下表获取list中的某一个值
llen list1 #返回列表长度
#组合命令
rpoplpush list1 list2 #移除列表的最后一个元素,将他移动到新的列表中
- 实际上是一个链表,before Node after,left,right都可以插入值
- 如果key不存在,创建新的链表
- 如果key存在,新增内容
- 如果移除了所有值,空链表,也代表不存在
- 在两边插入或改动值,效率最高;中间元素,效率会相对低一点
消息排队,消息队列(Lpush,Rpop),栈(Lpush,Lpop)
三、Set
set中的值是无序的不能重复的
#增
sadd set1 hello #往set中添加元素
#查
smembers set1 #查看指定set的所有值
sismember set1 hello #判断某一个值是否再set中
#删
srem set1 hello #移除set集合中的指定元素
scard set1 #获取set集合中的元素个数
srandmember set1 2 #随机抽选出指定个数的元素,若不写个数默认为1
spop set1 #随机删除并获取一个set集合中的元素
smove set1 set2 hello #将一个指定的值移动到另一个set集合
sdiff set1 set2 #差集
sinter set1 set2 #交集
sunion set1 set2 #并集
微博,B站,共同关注
- 差集
- 交集
- 并集
四、Hash
Map集合,key-map,这时候的value是map集合。本质与String类型没有太大区别,还是一个简单的key-value
#增、改
hset hash1 name zhangsan
hmset hash1 name zhangsan age 18 #批量增
#查
hget hash1 name
hmget hash1 name age #批量查
hgetall hash1 # 获取全部的数据
#删
hdel hash1 name #删除hash指定key字段,对应的value也会删除
****************************************************************************
hlen hash1 #判断hash表的字段数量
hexists hash1 name #判断hash中指定字段是否存在
hkeys hash1 #获取所有的field
hvals hash1 #获取所有的value
hincrby hash1 age 1 #指定增量
hsetnx hash1 name hello #如果不存在则可以设置,如果存在则不能设置
hash变更数据user,name,age,尤其是用户信息之类的,经常变动的信息,hash更适合于对象的存储,String更适合字符串存储。
五、Zset
Zset为有序集合,再set的基础上增加了一个值。
set k1 v1
zset k1 score v1
#增
zadd zset1 1 one
zadd zset1 2 two 3 three #批量增
#查
zrange zset 0 -1
#删
zrem zset1 one
zcard zset1 #获取有序集合中的个数
*****************************************************************************************
#排序
zrangebyscore zset1 -inf +inf #显示全部用户从小到大排序
zrangebyscore zset1 -inf +inf withscores #显示全部用户从小到大排序并显示score值
zrevrange zset1 0 -1 #从大到小进行排序
******************************************************************************************
zcount zset1 1 3 #获取指定区间的成员数量
存储班级成绩表,工资表排序,带权重进行判断,排行榜
三种特殊数据类型
一、Geospatial
geospatial -> 地理位置
定位、附近的人、打车距离计算
#有效的经度从-180度到180度。
#有效的纬度从-85.05112878度到85.05112878度。
#geoadd 增
geoadd china:city 116.40 39.90 beijing
#geopos 查
geopos china:city beijing
#geodist 两地之间距离
geodist china:city beijing shanghai km
# m 表示单位为米。
# km 表示单位为千米。
# mi 表示单位为英里。
# ft 表示单位为英尺
#georadius 以给定的经纬度为中心,找出某一半径内的元素
georadius china:city 110 30 1000 km #以110 30这个经纬度为中心寻找方圆1000km内的城市
#georadiusbymember 找出位于指定元素周围的其他元素
georadiusbymember china:city beijing 1000 km
#geohash 将二维的经纬度转换为一维的字符串,该命令将返回11个字符的字符串
geohash china:city beijing
#返回两个字符串,两个字符串越接近,那么距离越近
geohash china:city beijing shanghai
GEO底层实现原理就是Zset,可以使用Zset命令操作geo
二、Hyperloglog
什么是基数? 去重后的元素个数
Redis Hyperloglog 基数统计的算法
优点:占用的内存是固定的,2^64不同的元素的基数,只需要12KB内存,从内存方面比较,Hyperloglog是首选
pfadd mykey a b c d e f h h i j #创建第一组元素mykey
pfcount mykey #统计mykey元素的技术数量
pfmerge mykey3 mykey mykey2 #合并两组 mykey mykey2 => 并集
官方统计会有0.81%错误率,统计UV(独立访客统计),可以忽略不计
如果允许容错,那么一定可以使用Hyperloglog
三、Bitmaps
位存储:只有0和1
统计用户信息、活跃或不活跃、登录或未登录、打卡未打卡。两个状态的,都可以使用Bitmaps
Bitmaps 位图 ,数据结构。都是操作二进制位来进行记录,就只有0和1两个状态
例:记录周一到周日的打卡
#增加打卡记录
setbit sign 0 1
setbit sign 1 0
setbit sign 2 1
setbit sign 3 1
setbit sign 4 1
setbit sign 5 1
setbit sign 6 1
#查询某天打卡记录
getbit sign 3
#统计打卡天数,为1就算打卡,会统计值为1的数量
bitcount sign