前言
接受虚竹哥的建议,后续将发布redis的系列文章
本篇文章针对有关Redis7数据类型的的使用率较高的操作进行讲解,有关Redis7中数据类型的全部操作请查阅:Commands | Redis
上一篇文章:初识redis【redis的安装使用与卸载】_努力努力再努力mlx的博客-CSDN博客
大家有问题随时私信我即可~
目录
redis键(key)
redis字符串(String)
Redis列表(List)
Redis哈希(Hash)
Redis集合(Set)
Redis有序集合Zset(sorted set)
Redis位图(bitmap)
Redis基数统计(HyperLogLog)
Redis地理空间(GEO)
Redis流(Stream)
Redis位域(bitfield)
redis键(key)
常用的redis指令一览:
关于对key常用指令的详细介绍如下:
keys * #查看当前k=库中的所有keyexists key #判断某个key是否存在(在redis的指令中,0代表查询出0条指令(找不到符合条件的指令),1代表查询成功)
type key #查看当前key的数据类型
del key #删除指定的key
unlink key #非阻塞删除,仅仅将keys从keyspace元数据中删除,没真正的删除会在后续异步中操作,在当前我们只需要对这个指令有一定的印象,后续我们会对其进行进一步的介绍
ttl key #查看我们查询的key还有多少秒过期 -1表示永不过期 -2 表示已过期
expire key 秒 #给key设置过期时间
move key [0-15] #将当前数据库的key移动到指定的数据库中,redis默认是有16个数据库
select [0-15] #切换数据库[0-15],默认为0,下标超出0-15的范围会报错
dbsize # 查看当前数据库key的数量
flushdb #清空当前库,慎用
flushall #清空16个数据库 慎用这个操作考虑到很危险,在这里就先不演示了
help @ 类型 查看某个类型的帮助文档
notes:我们进行操作的指令并不区分大小写,但是我们自己手动设置的键是区分大小写的
redis字符串(String)
string 是redis中最基本的数据类型,一个key对应着一个value,string数据是二进制安全的,也就是说它可以存储任何数据,包括jpg文件和
String中的常用指令:
关于对String类型指令的详细介绍如下:
set key value
get key # 获取指定key对应的value值
mset [key1] [value1] [key2] [value2] [key3] [value3] #同时设置一个或多个键值对
mget [key1] [key2] [key3] #同时获取多个key的值
msetnx [key1] [value1] [key2] [value2] #同时设置一个或多个 key-value 对 必须保证key都不存在才能成功
获取指定区间
getrange [key] 0 -1 # 获取这个key的值的全部
getrange [key] 0 3# 获取这个key的值索引0到索引2之间的值
getrange [key] 1 xxx #设置指定区间范围内的值
数值增减
incr [key] # 递增数字 +1
incr [key] [increment] # 增加指定的整数 +increment
decr [key] # 递减数字 -1
decr [key] [increment] #减少指定的整数 -increment
获取字符串长度和内容相加
strlen [key] #获取key对应的值的长度
append [key] [vale] #添加字符串内容
分布式锁
setex [key] [过期时间] [value] # 设置带过期时间的key,动态设置
setnx [key] [value] # 只有在 key 不存在时设置 key 的值。
set [key] [value] get # 给定 key 的值设为 value ,并返回 key 的旧值
getset [key] [value] # 给定 key 的值设为 value ,并返回 key 的旧值
应用场景:
1.抖音点赞2.文章喜欢点赞
Redis列表(List)
对list的介绍
一个双端链表的结构,容量是2的32次方减1个元素,大概40多亿,主要功能有push/pop等,一般用在栈、队列、消息队列等场景。list对应的是单key多value
left、right都可以插入添加;
如果键不存在,创建新的链表;
如果键已存在,新增内容;
如果值全移除,对应的键也就消失了。
- 它list的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
- 的
- li;list的常用操作
对list操作的常用介绍
lpush [key] [value] ... // 往 列表头部(左边)放入元素
rpush [key] [value] ... // 往 列表(右边)放入元素
lrange [key] 0 -1 // 从左边开始遍历列表 只能从左边遍历
lpop [key] // 最左边的出栈 也就是lrange遍历的第一个
rpop [key] // 最右边的出栈 也就是lrange遍历的最后一个
lindex [key] [index] // 通过索引值获取值
llen [key] // 获得元素个数
lrem [key] [num] [value] // 从左往右删除 num个值为 value的值
lrem [key] 0 [value] // 从左往右删除所有值为value的值
ltrim [key] [开始] [结束] // 截取指定范围的值后再赋给[key],即删除这个区间外的值
rpoplpush [key1] [key2] [value] //移除列表的最后一个元素,并将该元素添加到另一个列表的第一个并返回
lset [key] [index] [value] //将key的第 index 个索引值改为value
linsert [key] brfore/after [value1] [value2] // 在list某个已有值的前后再添加具体值应用场景
微信公众号给我推我订阅作者的文章当我订阅的作者发布了两篇新文章,对应的id分别是11 和 22
lpush likearticle:ljl 11 22
我想要查看前十条订阅文章信息:
lrange likearticle:ljl 0 9
Redis哈希(Hash)
简要介绍
当我们讲到哈希时,我们第一反应肯定是java中的hashmap。redis中的哈希与java中的哈希类似,k-v 模式不变,但v是一个键值对 => Map<String,Map<Object,Object>
常用指令一览
常用指令详细介绍
hset/hget/hmset/hmget/hgetall/hdel //hset/get对应的是获取值和得到值 hmset/hmget是获取和得到多个值 hgetall是获取全部值 hdel是删除某个值
hlen // 获取在某个key内的全部数量
hexists [key] [k1] // 看key中是否有k1这个键
hkeys [key] // 获取key里面的所有key
hvals [key] // 获取key里面的所有value
hincrby [key] k1 [num] // key里面k1的值增长num 整数
hincrbyfloat [key] k1 [num] // key里面k1的值增长num 小数
hsetnx [key] k1 [value] // 不存在赋值,存在了无效hash的典型的应用场景:
购物车早期的应用
Redis集合(Set)
简要介绍
当我们想到set时,我们最先想到的是java中的hashset,在redis中的set集合,set中的值必须不重复,他存放数据的方式是单值多value
常用指令
常用指令的详细介绍
SADD key member ... // 添加元素
SMEMBERS key // 遍历集合中所有元素
SISMEMBER key member // 判断某个元素是否在集合中SREM key member ... // 删除元素
SCARD key // 获取集合长度
SRANDMEMBER key m // 从set集合里面随机取出m个 如果超过最大数量就全部取出如果写的值是负数,比如-3 ,表示需要取出3个,但是可能会有重复值 不会删除
SPOP key m // 从集合中随机弹出一个元素 出一个删一个
SMOVE key1 key2 在key1里已存在的某个值 // 将key1的已存在的某个值赋给key2
集合运算
SDIFF keyA keyB // A - B 属于A但不属于B的元素构成的集合
SUNION keyA keyB // A U B 属于A或者属于B的元素合并后的集合
SINTER keyA keyB // A ∩ B 属于A同时属于B
SINTERCARD numkeys keyA keyB [LIMIT limit] // 同样是求交集,不返回结果集,只返回结果的基数 limit用于限制交集的基数,如果在运算过程中结果超过了limit的限制数,直接返回典型应用场景
1.vx抽奖
2.vx朋友圈设置同赞的朋友
3.qq中推可能认识的人
Redis有序集合Zset(sorted set)
对zset的介绍
zset是在set的基础上加了score这样一个字段,正是因为这个字段,zset可以在满足set特点的基础上对元素进行排序
常用的关于zset的指令
zset常用指令的详细介绍
ZADD key score member [ score member ] // 添加元素
ZRANGE key start stop [WITHSCORES] // 返回元素分数从小到大的顺序 返回索引从start到stop之间的所有元素
ZREVRANGE key 0 - 1 [WITHSCORES] // 反序
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] // 获取指定分数范围的元素 (min,max) 不包含 limit是返回限制,返回多少个
ZSCORE key member // 获取元素的分数
ZCARD key // 获取集合中元素的数量
ZREM key 某score下对应的value值 // 删除元素
ZINCRBY key increment member // 增加某个元素的分数
ZCOUNT key min max // 获得指定分数范围内的元素个数
ZMPOP numkeys key [key …] <MIN | MAX> [COUNT count] // 从键名列表中的第一个非空排序集中弹出一个或多个亓素,它们是成员分数对
ZRANK key values值 // 获得下标值
ZREVRANK key values // 逆序获得下标值
应用场景:
根据商品的销售量对商品进行排序
Redis位图(bitmap)
位图的概念
说明:用String类型作为底层数据结构实现的一种统计二值状态的数据类型
位图本质是数组,它是基于String数据类型的按位的操作。该数组由多个二进制位组成,每个二进制位都对应一个偏移量(我们称之为一个索引)。Bitmap支持的最大位数是2^32位,它可以极大的节约存储空间,使用512M内存就可以存储多达42.9亿的字节信息(2^32 = 4294967296)
常用命令一览
常用命令详细介绍
SETBIT key offset value // 将第offset的值设为value value只能是0或1 offset 从0开始
GETBIT key offset // 获得第offset位的值
STRLEN key // 得出占多少字节 超过8位后自己按照8位一组一byte再扩容
BITCOUNT key // 得出该key里面含有几个1
BITOP and destKey key1 key2 // 对一个或多个 key 求逻辑并,并将结果保存到 destkey
以下操作同理,在这里不进行赘述~BITOP or destKey key1 key2 // 对一个或多个 key 求逻辑或,并将结果保存到 destkey
BITOP XOR destKey key1 key2 // 对一个或多个 key 求逻辑异或,并将结果保存到 destkey
BITOP NOT destKey key1 key2 // 对一个或多个 key 求逻辑非,并将结果保存到 destkey典型应用场景:
签到的应用场景很适合用位图一年365天,天天签到的占多少天
按照年
Redis基数统计(HyperLogLog)
基本介绍
去重复统计功能的基数估计算法就是 HyperLogLog,基数是一种数据集,去重复后的真实个数。基数统计用于统计一个集合中不重复的元素个数,就是对集合去重复后剩余元素的计算只需要花费内存,就能记录 2的64次方=18446744073709551616 个不同元素的基数。但是,因为HyperLogLog只会根据输入元素来计算基数,而不会储存输入元素本身,所以HyperLogLog 不能像集合那样,返回输入的各个元素。
常用指令
pfadd hyl1 1 1 1 1 2 3 6
pfadd hyl2 2 4 4 4 6 7 8 9
pfcount hyl2 //计算hyl2中去重后元素个数
pfmerge distResult hyl2 hyl1 //合并hyl2和 hyl1中元素并去重
pfcount disResult //计算hyl2中去重后元素个数应用场景
天猫网站首页亿级UV的redis统计方案
Redis地理空间(GEO)
简要介绍
地球上的地理位置是使用二维的经纬度表示,经度范围 (-180, 180],纬度范围 (-90, 90],只要我们确定一个点的经纬度就可以名取得他在地球的位置。
例如滴滴打车,最直观的操作就是实时记录更新各个车的位置
然后当我们要找车时,在数据库中查找距离我们(坐标x0,y0)附近r公里范围内部的车辆
经纬度去地图上直接复制:拾取坐标系统
常用指令
常用指定详细介绍
GEOADD city 116.403963 39.915119 "天安门" 116.403414 39.924091 "故宫" //GEOADD添加经纬度坐标
ZRANGE city 0 -1 // 查看(会出现中文乱码)
redis -cli -a 111111 -p 6379 -- raw // 解决中文乱码
GEOPOS city 天安门 故宫 // GEOPOS 返回经纬度
//GEOHASH返回坐标的 geohash 表示 (base32编码)
GEOHASH city 天安门 故宫
//GEODIST 返回两个位置之间的距离(m km )
GEODIST city 天安门 长城 km
//GEORADIUS 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
GEORADIUS city 116.418017 39.9144444 10 km withdist withcoord count 10 desc
//GEORADIUSBYMEMBER 找出指定范围内的元素,中心点是由给定的位置元素决定
GEORADIUsbymember city 天安门 10 km withdist withcoord count 10 withhash应用场景
- 美团附近的饭店、酒店
- 高德地图附近的店
Redis流(Stream)
流的内容我单独整理为一篇博客啦~
redis【stream】:对redis流数据类型的详细介绍_努力努力再努力mlx的博客-CSDN博客
Redis位域(bitfield)
基本介绍
用途:一句话说,将一个Redis字符串看作是一个由二进制位组成的数组,并能对变长位宽和任意没有字节对齐的指定整型位域进行寻址和修改
两个功能具体如下:
- 位域修改
- 溢出控制
基本语法