酒店网站模版,湖北高速公路建设网站,网站上传文件代码,可以自己制作动画的app五种常见数据类型 Redis中的数据类型指的是 value存储的数据类型#xff0c;key都是以String类型存储的#xff0c;value根据场景需要#xff0c;可以以String、List等类型进行存储。 各数据类型介绍#xff1a; Redis数据类型对应的底层数据结构 String 类型的应用场景 常…五种常见数据类型 Redis中的数据类型指的是 value存储的数据类型key都是以String类型存储的value根据场景需要可以以String、List等类型进行存储。 各数据类型介绍 Redis数据类型对应的底层数据结构 String 类型的应用场景 常用命令 存放键值set key value [EX seconds] [PX milliseconds] [NX|XX] [NX|XX] : nx如果key不存在则建立 xx如果key存在则修改其值也可以直接使用setnx/setex命令 获取键值get key 值递增/递减incr key 如果字符串中的值是数字类型的可以使用incr命令每次递增不是数字类型则报错。 一次想递增N用incrby命令如果是浮点型数据可以用incrbyfloat命令递增。 同样递减使用decr、decrby命令。 批量存放键值mset key value [key value ...] 批量获取键值mget key [key ...] 获取值长度strlen key 追加内容append key value 获取部分字符getrange key start end 缓存对象 使用 String 来缓存对象有两种方式 直接缓存整个对象的 JSON命令例子 SET user:1 {name:seven, age:18}。 采用将 key 进行分离为 user:ID:属性采用 MSET 存储用 MGET 获取各属性值命令例子 MSET user:1:name seven1 user:1:age 18 user:2:name seven2 user:2:age 20 常规计数 比如计算访问次数、点赞、转发、库存数量等等。 # 初始化文章的阅读量SET aritcle:readcount:1001 0
OK
#阅读量1INCR aritcle:readcount:1001
(integer) 1
#阅读量1INCR aritcle:readcount:1001
(integer) 2 分布式锁 之所以采用Redis来作为分布式锁可以有几方面理由 redis足够的快 redis提供了setnx expire的机制完全契合分布式锁的实现要点 Redisson客户端的流行使得基于redis的分布式锁更加简单 SET 命令有个 NX 参数可以实现「key不存在才插入」可以用它来实现分布式锁 如果 key 不存在则显示插入成功可以用来表示加锁成功 如果 key 存在则会显示插入失败可以用来表示加锁失败。 一般而言还会对分布式锁加上过期时间分布式锁的命令如下 SET lock_key unique_value NX PX 10000 lock_key 就是 key 键 unique_value 是客户端生成的唯一的标识 NX 代表只在 lock_key 不存在时才对 lock_key 进行设置操作 PX 10000 表示设置 lock_key 的过期时间为 10s这是为了避免应用在运行过程中发生异常而无法释放锁。 共享 session 信息 通常情况下可以使用session信息保存用户的登录会话状态由于这些 Session 信息会被保存在服务器端如果用户一的 Session 信息被存储在服务器一但第二次访问时用户一被分配到服务器二这个时候服务器并没有用户一的 Session 信息就会出现需要重复登录的问题。如下 可以借助 Redis 对这些 Session 信息进行统一的存储和管理这样无论请求发送到那台服务器服务器都会去同一个 Redis 获取相关的 Session 信息这样就解决了分布式系统下 Session 存储的问题。 List 类型的应用场景 常用命令 存储值 左端存值lpush key value [value ...] 右端存值rpush key value [value ...] 索引存值lset key index value 弹出元素 左端弹出lpop key 右端弹出rpop key 获取元素个数llen key 获取列表元素 两边获取lrange key start stop 索引获取lindex key index 删除元素 根据值删除lrem key count value 范围删除ltrim key start stop 消息队列 消息保序使用 LPUSH RPOP对队列进行先进先出的消息处理满足消息队列的保序性 阻塞读取使用 BRPOP阻塞读取队列中的数据避免消费者不停地调用 RPOP 命令带了不必要的性能损失 重复消息处理生产者实现全局唯一 ID满足消息队列的处理重复消息的能力 消息的可靠性使用 BRPOPLPUSH让消费者程序从一个 List 中读取消息同时Redis 会把这个消息再插入到另一个 List可以叫作备份 List留存这样一来如果消费者程序读了消息但没能正常处理等它重启后就可以从备份 List 中重新读取消息并进行处理了。满足消息队列的可靠性 但是有两个问题 生产者需要自行实现全局唯一 ID 不能以消费组形式消费数据 Hash 类型 常用命令 存放值 单个hset key field value 多个hmset key field value [field value ...] 不存在时hsetnx key field value 获取字段值 单个hget key field 多个hmget key field [field ...] 获取所有键与值hgetall key 获取所有字段hkeys key 获取所有值hvals key 判断是否存在hexists key field 获取字段数量hlen key 递增/减hincrby key field increment 删除字段hdel key field [field ...] 缓存对象 一般对象用 String Json 存储对象中某些频繁变化的属性可以考虑抽出来用 Hash 类型存储。 购物车 以用户 id 为 key商品 id 为 field商品数量为 value恰好构成了购物车的3个要素如下图所示。 涉及的命令如下 添加商品HSET cart:{用户id} {商品id} 1 添加数量HINCRBY cart:{用户id} {商品id} 1 商品总数HLEN cart: 删除商品HDEL cart: 获取购物车所有商品HGETALL cart: Set 类型 聚合计算并集、交集、差集场景比如点赞、共同关注、抽奖活动等。 常用命令 存储值sadd key member [member ...] 获取所有元素smembers key 随机获取srandmember langs count 判断是否存在某membersismember key member 获取集合中元素个数scard key 删除集合元素srem key member [member ...] 弹出元素spop key [count] 点赞 可以保证一个用户只能点一个赞已经点赞过的用户不能再点赞 # uid:1 用户对文章 article:1 点赞SADD article:1 uid:1
(integer) 1
# uid:2 用户对文章 article:1 点赞SADD article:1 uid:2
(integer) 1
# uid:3 用户对文章 article:1 点赞SADD article:1 uid:3
(integer) 1# uid:1 取消了对 article:1 文章点赞。SREM article:1 uid:1
(integer) 1# 获取 article:1 文章所有点赞用户 :SMEMBERS article:1
1) uid:3
2) uid:2# 获取 article:1 文章的点赞用户数量SCARD article:1
(integer) 2 共同关注 Set 类型支持交集运算所以可以用来计算共同关注的好友、公众号等。 key 可以是用户idvalue 则是已关注的公众号的id。 # uid:1 用户关注公众号 id 为 5、6、7、8、9SADD uid:1 5 6 7 8 9
(integer) 5
# uid:2 用户关注公众号 id 为 7、8、9、10、11SADD uid:2 7 8 9 10 11
(integer) 5# 获取共同关注SINTER uid:1 uid:2
1) 7
2) 8
3) 9# 给 uid:2 推荐 uid:1 关注的公众号在uid:1中有但是uid:2中没有的SDIFF uid:1 uid:2
1) 5
2) 6# 验证某个公众号是否同时被 uid:1 或 uid:2 关注:SISMEMBER uid:1 5
(integer) 1 # 返回0说明关注了SISMEMBER uid:2 5
(integer) 0 # 返回0说明没关注 抽奖活动 存储某活动中中奖的用户名 Set 类型因为有去重功能可以保证同一个用户不会中奖两次。 # key为抽奖活动名value为员工名称把所有员工名称放入抽奖箱
SADD lucky Tom Jerry John Sean Marry Lindy Sary Mark
(integer) 5# 如果允许重复中奖可以使用 SRANDMEMBER 命令。
# 抽取 1 个一等奖SRANDMEMBER lucky 1
1) Tom
# 抽取 2 个二等奖SRANDMEMBER lucky 2
1) Mark
2) Jerry
# 抽取 3 个三等奖SRANDMEMBER lucky 3
1) Sary
2) Tom
3) Jerry# 如果不允许重复中奖可以使用 SPOP 命令。
# 抽取一等奖1个SPOP lucky 1
1) Sary
# 抽取二等奖2个SPOP lucky 2
1) Jerry
2) Mark
# 抽取三等奖3个SPOP lucky 3
1) John
2) Sean
3) Lindy Zset 类型 排序场景比如排行榜、电话和姓名排序等。 常用命令 存储值zadd key [NX|XX] [CH] [INCR] score member [score member ...] 获取元素分数zscore key member 获取排名范围zrange key start stop [WITHSCORES] 获取指定分数范围排名zrangebyscore key min max [WITHSCORES] [LIMIT offset count] 增加指定元素分数zincrby key increment member 获取集合元素个数zcard key 获取指定范围分数个数zcount key min max 删除指定元素zrem key member [member ...] 获取元素排名zrank key member Zset结构 typedef struct zset {dict *dict;//哈希表zskiplist *zsl;//跳表
} zset; zset 结构体里有两个数据结构一个是跳表一个是哈希表。这样的好处是既能进行高效的范围查询如 ZRANGEBYSCORE 操作利用了跳表也能进行高效单点查询如 ZSCORE 操作利用了hash表。 排行榜 五篇博文分别获得赞为 200、40、100、50、150。 # arcticle:1 文章获得了200个赞ZADD user:seven:ranking 200 arcticle:1
(integer) 1
# arcticle:2 文章获得了40个赞ZADD user:seven:ranking 40 arcticle:2
(integer) 1
# arcticle:3 文章获得了100个赞ZADD user:seven:ranking 100 arcticle:3
(integer) 1
# arcticle:4 文章获得了50个赞ZADD user:seven:ranking 50 arcticle:4
(integer) 1
# arcticle:5 文章获得了150个赞ZADD user:seven:ranking 150 arcticle:5
(integer) 1# 获取文章赞数最多的 3 篇文章, ZREVRANGE 命令倒序获取有序集合 key 从start下标到stop下标的元素
# WITHSCORES 表示把 score 也显示出来ZREVRANGE user:seven:ranking 0 2 WITHSCORES
1) arcticle:1
2) 200
3) arcticle:5
4) 150
5) arcticle:3
6) 100# 获取 100 赞到 200 赞的文章ZRANGEBYSCORE 命令返回有序集合中指定分数区间内的成员分数由低到高排序ZRANGEBYSCORE user:xiaolin:ranking 100 200 WITHSCORES
1) arcticle:3
2) 100
3) arcticle:5
4) 150
5) arcticle:1
6) 200 电话姓名排序 电话排序 # 将电话号码存储到 SortSet 中然后根据需要来获取号段ZADD phone 0 13100111100 0 13110114300 0 13132110901
(integer) 3ZADD phone 0 13200111100 0 13210414300 0 13252110901
(integer) 3ZADD phone 0 13300111100 0 13310414300 0 13352110901
(integer) 3# 获取所有号码ZRANGEBYLEX phone -
1) 13100111100
2) 13110114300
3) 13132110901
4) 13200111100
5) 13210414300
6) 13252110901
7) 13300111100
8) 13310414300
9) 13352110901# 获取 132 号段的号码ZRANGEBYLEX phone [132 (133
1) 13200111100
2) 13210414300
3) 13252110901# 获取132、133号段的号码ZRANGEBYLEX phone [132 (134
1) 13200111100
2) 13210414300
3) 13252110901
4) 13300111100
5) 13310414300
6) 13352110901 姓名排序 zadd names 0 Toumas 0 Jake 0 Bluetuo 0 Gaodeng 0 Aimini 0 Aidehua
(integer) 6# 获取所有人的名字:ZRANGEBYLEX names -
1) Aidehua
2) Aimini
3) Bluetuo
4) Gaodeng
5) Jake
6) Toumas# 获取名字中大写字母A开头的所有人ZRANGEBYLEX names [A (B
1) Aidehua
2) Aimini# 获取名字中大写字母 C 到 Z 的所有人ZRANGEBYLEX names [C [Z
1) Gaodeng
2) Jake
3) Toumas BitMap2.2 版新增 介绍 适用于二值状态统计的场景。 签到 只记录签到1或未签到0 # 记录用户 4 月 3 号已签到
SETBIT uid:sign:100:202304 2 1# 检查该用户 6 月 3 日是否签到GETBIT uid:sign:100:202306 3
1# 统计用户在 6 月份的签到次数BITCOUNT uid:sign:100:202206
1# 统计这个月首次打卡时间BITPOS key bitValue [start] [end]start end 表示要检测的范围
BITPOS uid:sign:100:202206 1 判断用户登陆状态 key login_status 表示存储用户登陆状态集合数据 将用户 ID 作为 offset在线就设置为 1下线设置 0。通过 GETBIT判断对应的用户是否在线。 5000 万用户只需要 6 MB 的空间。 # 表示ID 10086 的用户已登陆
SETBIT login_status 10086 1# 检查该用户是否登陆返回值 1 表示已登录
GETBIT login_status 10086# 登出将 offset 对应的 value 设置成 0。
SETBIT login_status 10086 0 连续签到用户总数 把每天的日期作为 Bitmap 的 keyuserId 作为 offset若是打卡则将 offset 位置的 bit 设置成 1。key 对应的集合的每个 bit 位的数据则是一个用户在该日期的打卡记录。 那就可以设置 7 个 Bitmap对这 7 个 Bitmap 的对应的 bit 位做 『与』运算。那么当一个 userID 在 7 个 Bitmap 对应对应的 offset 位置的 bit 1 就说明该用户 7 天连续打卡。结果保存到一个新 Bitmap 中我们再通过 BITCOUNT 统计 bit 1 的个数便得到了连续打卡 7 天的用户总数了。 HyperLogLog2.8 版新增 海量数据基数统计的场景提供不精确的去重计数。但要注意HyperLogLog 的统计规则是基于概率完成的不是非常准确标准误算率是 0.81%。因此适用于海量数据的场景。 HyperLogLog 的优点是在输入元素的数量或者体积非常非常大时计算基数所需的内存空间总是固定的、并且是很小的。在 Redis 里面每个 HyperLogLog 键只需要花费 12 KB 内存就可以计算接近 2^64 个不同元素的基数和元素越多就越耗费内存的 Set 和 Hash 类型相比HyperLogLog 就非常节省空间。 百万级网页 UV 计数 在统计 UV 时可以用 PFADD 命令用于向 HyperLogLog 中添加新元素把访问页面的每个用户都添加到 HyperLogLog 中。 PFADD page1:uv user1 user2 user3 user4 user5# 可以用 PFCOUNT 命令直接获得 page1 的 UV 值获取统计结果
PFCOUNT page1:uv GEO3.2 版新增 存储地理位置信息的场景
Redis GEO 操作方法有 geoadd添加地理位置的坐标。 geopos获取地理位置的坐标。 geodist计算两个位置之间的距离。 georadius根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。 georadiusbymember根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。 georadius以给定的经纬度为中心 返回键包含的位置元素当中 与中心的距离不超过给定最大距离的所有位置元素。
GEORADIUS方法参数
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key] 参数说明 m 米默认单位。 km 千米。 mi 英里。 ft 英尺。 WITHDIST: 在返回位置元素的同时 将位置元素与中心之间的距离也一并返回。 WITHCOORD: 将位置元素的经度和维度也一并返回。 WITHHASH: 以 52 位有符号整数的形式 返回位置元素经过原始 geohash 编码的有序集合分值。这个选项主要用于底层应用或者调试 实际中的作用并不大。 COUNT 限定返回的记录数。 ASC: 查找结果根据距离从近到远排序。 DESC: 查找结果根据从远到近排序。 滴滴叫车 假设车辆 ID 是 33经纬度位置是116.03457939.030452可以用一个 GEO 集合保存所有车辆的经纬度集合 key 是 cars:locations。 GEOADD cars:locations 116.034579 39.030452 33 当用户想要寻找自己附近的网约车时LBS 应用就可以使用 GEORADIUS 命令。例如LBS 应用执行下面的命令时Redis 会根据输入的用户的经纬度信息116.05457939.030452 查找以这个经纬度为中心的 5 公里内的车辆信息并返回给 LBS 应用。 GEORADIUS cars:locations 116.054579 39.030452 5 km ASC COUNT 10 附近的人 nearbyPeople 是一个总的 keyuser_1 和 user_2 是相当于 nearbyPeople 里面的两个元素以及他们对应的经纬度这个例子就是把 user_1 和 user_2 的经纬度存在了 nearbyPeople 这个 key 中 redis GEOADD nearbyPeople 13.36 38.11 user_1 15.08 37.50 user_2
(integer) 2 获取 nearbyPeople 中的元素 user_1 和 user_2 这两个元素的经纬度当然如果之前没有 geoadd 相对应元素的经纬度的话会返回 nil redis GEOPOS nearbyPeople user_1 user_21) 1) 13.36138933897018433 2) 38.115556395496298592) 1) 15.08726745843887329 2) 37.50266842333162032 获取 nearbyPeople 中 user_1 和 user_2 这两个节点之间的距离距离单位可以指定如下所示 m 米默认单位。 km 千米。 mi 英里。 ft 英尺。 redis GEODIST nearbyPeople user_1 user_2166274.1516redis GEODIST nearbyPeople user_1 user_2 km166.2742redis GEODIST nearbyPeople user_1 user_2 mi103.3182 把 nearbyPeople 中的 距离经纬度(15,37)200km 以内的元素都找出来而且带上距离 redisGEORADIUS nearbyPeople 15 37 200 km WITHDIST
1) 1) user_1 2) 190.4424
2) 1) user_2 2) 56.4413 Stream5.0 版新增 消息队列解决了基于 List 类型实现的消息队列中存在的两个问题。可以自动生成全局唯一消息ID并支持以消费组形式消费数据。 文章转载自Seven 原文链接https://www.cnblogs.com/seven97-top/p/18554013 体验地址引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构