• Redis应用场景


    目录

    一、Redis

    1、Redis数据类型的应用场景

    1.1、string

    1.2、list

    1.3、hash

    1.4、set

    1.5、zset(sorted set)

    2、Redis事务

    3、Redis Lua脚本


    一、Redis

    Redis命令不区分大小写的,而key是区分大小写的

    1. Redis查看版本
    2. 方式1
    3. [root@localhost bin]# redis-server -v
    4. Redis server v=7.2.3 sha=00000000:0 malloc=jemalloc-5.3.0 bits=64 build=5d4f410fac2878e4
    5. [root@localhost bin]#
    6. 方式2
    7. 127.0.0.1:6379> info
    8. # Server
    9. redis_version:7.2.3
    10. redis_git_sha1:00000000
    11. redis_git_dirty:0
    12. redis_build_id:5d4f410fac2878e4
    13. redis_mode:standalone
    14. os:Linux 3.10.0-1160.71.1.el7.x86_64 x86_64
    15. arch_bits:64
    16. monotonic_clock:POSIX clock_gettime
    17. multiplexing_api:epoll
    18. atomicvar_api:atomic-builtin
    19. .....

    Redis官网

    Redis中文网站

    1、Redis数据类型的应用场景

    1. 面试题:
    2. 1、redis五种传统的数据类型你如何使用的?用在哪些场景?
    3. 2、除了上述5大数据类型,你还知道其他redis的类型吗?
    4. bitmap(位图)
    5. HyperLogLog(统计)
    6. GEO(地理)
    7. Stream

    1.1、string

    1. 1、最常用
    2. set key value
    3. get key
    4. 2、同时设置/获取多个键值
    5. mset key value key value ...
    6. mget key key1 ....
    7. 3、数值增减
    8. 递增数字
    9. incr key
    10. 增加指定整数
    11. incrby key increment
    12. 递减数值
    13. decr key
    14. 减少指定的整数
    15. decrby key decrement
    16. 4、获取字符串的长度
    17. strlen key
    18. 5、分布式锁
    19. setnx key value
    20. set key value [EX seconds] [PX milliseconds] [NX|XX]
    21. EX:key在多少秒之后过期
    22. PX:key在多少毫秒之后过期
    23. NX:当key不存在的时候,才创建key,效果等同于setnx
    24. XX:当key存在的时候,覆盖key

    应用场景:

    1、商品编号、订单号采用INCR命令生成

    2、是否喜欢的文章(点赞/踩一踩) 统计喜欢/不喜欢某篇文章

    阅读数,只要点击了rest地址,直接可以使用incr key命令增加一个数字1,完成记录数字

    1.2、list

    1. 1、向列表左边添加元素
    2. LPUSH key value [value...]
    3. 2、向列表右边添加元素
    4. RPUSH key value [value...]
    5. 3、查看列表
    6. LRANGE key start stop
    7. 4、获取列表中元素的个数
    8. LLEN key

    应用场景:

    1、微信文章订阅公众号-->订阅号消息

    1. 用户uid1024关注公众号d11 d22
    2. lpush follow:uid1024 d11 d22
    3. d11 d22发布新文章显示,相当于查看, 0 -1 查看所有
    4. lrange follow:uid1024 0 -1

    1.3、hash

    redis hash 对应====>java中的结构  Map>

    1. 1、一次设置一个字段值
    2. HSET key field value
    3. 2、一次获取一个字段值
    4. HGET key field
    5. 3、一次设置多个字段值
    6. HMSET key field value [field value...]
    7. 4、一次获取多个字段值
    8. HMGET key field [field ...]
    9. 5、获取所有字段值
    10. HGETALL KEY
    11. 6、获取某个key内的全部数量
    12. hlen key
    13. 7、删除一个key
    14. hdel key

    应用场景:

    1、购物车,全选商品,增加商品数量.....

    1. 新增商品-->hset shopcar:uid1024 334488 1
    2. 新增商品-->hset shopcar:uid1024 334477 1
    3. 增加商品数量-->hincrby shopcar:uid1024 334477 1
    4. 商品总数-->hlen shopcar:uid1024
    5. 全部选择-->hgsetall shopcar:uid1024

    1.4、set

    1. 1、添加元素
    2. SADD key member [member...]
    3. 2、删除元素
    4. SREM key member [member...]
    5. 3、获取集合中的所有元素
    6. SMEMBERS key
    7. 4、判断元素是否在集合中
    8. SISMEMBERS key member
    9. 5、获取集合中的元素个数
    10. SCARD key
    11. 6、从集合中随机弹出一个元素,元素不删除 [数字]抽出几个
    12. SRANDMEMBER key[数字]
    13. 7、从集合中随机弹出一个元素,出一个删除一个 [数字]抽出几个
    14. SPOP key[数字]
    15. 8、集合运算
    16. 8.1、集合的差集运算A - B 属于A但不属于B的元素构成的集合
    17. SDIFF key[key ...]
    18. 8.2、集合的交集运算A ∩ B 属于A同时也属于B的元素构成的集合
    19. SINTER key[key ...]
    20. 8.3、集合的并集运算A ∪ B 属于A或者属于B的元素构成的集合
    21. SUNION key[key ...]

    应用场景:

    1、微信抽奖小程序

    1. 1、用户ID,立即参与按钮
    2. sadd key 用户id
    3. 2、显示有多少人参与了
    4. SCARD key
    5. 3、从集合中随机弹出一个元素,元素不删除 [数字]抽出几个
    6. SRANDMEMBER key[数字]
    7. 4、从集合中随机弹出一个元素,出一个删除一个 [数字]抽出几个
    8. SPOP key[数字]

    2、微信朋友圈点赞

    1. 1、用户ID,新增点赞按钮
    2. sadd key 点赞用户id 点赞用户id2 点赞用户id3 ...
    3. 2、取消点赞
    4. srem key 点赞用户id 点赞用户id2 点赞用户id3 ...
    5. 3、展现所有点赞过的用户
    6. SMEMBERS key
    7. 4、点赞用户数统计,就是常见的点赞红色数字
    8. scard key
    9. 5、判断某个朋友是否对楼主点赞过
    10. SISMEMBERS key 点赞用户id

    3、微博好友关注社交关系

    1. 1、共同关注的人,取交集
    2. SINTER key1 key2

    4、QQ内推可能认识的人

    1. 1、取差集,我认识的但你不认识的,差集
    2. SDIFF key1 key2...

    1.5、zset(sorted set)

    1. 1、向有序集合中加入一个元素和该元素的分数,添加元素
    2. ZADD key score member [score member...]
    3. 2、按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素
    4. ZRANGE key start stop [WISHSCORES]
    5. 3、获取元素的分数
    6. ZSCORE key member
    7. 4、删除元素
    8. ZREM key member [member ...]
    9. 5、获取指定分数范围的元素
    10. ZRANGEBYSCORE key min max [WISHSCORES][LIMIT offset count]
    11. 6、增加某个元素的分数
    12. ZINCRBY key increment member
    13. 7、获取集合中元素的数量
    14. ZCARD key
    15. 8、获得指定分数范围内的元素个数
    16. ZCOUNT key min max
    17. 9、按照排名范围删除元素
    18. ZREMRANGEBYRANK key start stop
    19. 10、获取元素的排名
    20. 从小到大 ZRANK key member
    21. 从大到小 ZREVRANK key member

    应用场景:

    1、根据商品销售对商品进行排序显示

    1. 定义商品销售排行榜(sorted set 集合),key为goods:sellsort,分数为商品销售数量
    2. 1、商品id1001的销售数量是9,商品id1002的销售数量是15
    3. zadd goods:sellsort 9 1001 15 1002
    4. 2、有一个客户又买了21001的商品
    5. zincrby goods:sellsort 2 1001
    6. 3、求商品销售前10
    7. zrange goods:sellsort 0 10 withscores

    2、抖音热搜

    1. 1、点击视频
    2. zincrby hotvcr:20231024 1 孙悟空三打白骨精
    3. zincrby hotvcr:20231024 15 孙悟空三打白骨精 4 东游记
    4. 2、展示当前排行前10
    5. zrevrange hotvcr:20231024 0 9 withscores

    SSM--->SSR

    2、Redis事务

    事务介绍

        Redis的事务是通过MULTI、EXEC、DISCARD、WATCH这四个命令来完成。

        Redis的单个命令都是原子性的,所以这里确保事务性的对象是命令集合

        Redis将命令集合序列化并确保处于一事务的命令集合连续且不被打断的执行。

        Redis不支持回滚的操作。

    MULTI
        注:用于标记事务块的开始
        Redis会将后续的命令逐个放入队列中,然后使用EXEC命令原子化地执行这个命令序列

            语法:MULTI
    EXEC
        在一个事务中执行所有先前放入队列的命令,然后恢复正常的连接状态。

            语法:EXEC

    DISCARD
        清除所有先前在一个事务中放入队列的命令,然后恢复正常的连接状态。

            语法:DISCARD

    WATCH
        当某个事务需要按条件执行时,就要使用这个命令将给定的键设置为受监控的状态。

            语法:WATCH key[key....]

            相当于redis的乐观锁

    UNWATCH

        清除所有先前为一个事务监控的键。

            语法:UNWATCH

    1. 127.0.0.1:6379> set k1 v1
    2. OK
    3. 127.0.0.1:6379> set k2 v2
    4. OK
    5. 127.0.0.1:6379> MULTI
    6. OK
    7. 127.0.0.1:6379> set k1 v11
    8. QUEUED
    9. 127.0.0.1:6379> set k2 v22
    10. QUEUED
    11. 127.0.0.1:6379> EXEC
    12. 1) OK
    13. 2) OK
    14. 127.0.0.1:6379> get k1
    15. "v11"
    16. 127.0.0.1:6379>

    WATCH

    1. redis客户端1:
    2. 127.0.0.1:6379> set k1 1
    3. OK
    4. 127.0.0.1:6379> set k2 2
    5. OK
    6. 127.0.0.1:6379> watch k1
    7. OK
    8. 127.0.0.1:6379> multi
    9. OK
    10. 127.0.0.1:6379> set k1 11
    11. QUEUED
    12. 127.0.0.1:6379> set k2 22
    13. QUEUED
    14. #此时redis客户端2进行修改k1再继续执行下面的exec,就会执行失败,效果如下
    15. 127.0.0.1:6379> exec
    16. (nil)
    17. 127.0.0.1:6379>
    18. redis客户端2
    19. 127.0.0.1:6379> set k1 aaa
    20. OK
    21. 127.0.0.1:6379> get k1
    22. "aaa"

    3、Redis Lua脚本

    Redis2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。使用脚本的好处如下:

    1. 减少网络开销:本来5次网络请求的操作,可以用一个请求完成。
    2. 原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。
    3. 替代Redis的事务功能:官网推荐Redis事务功能可以使用redis lua替代

    从Redis2.6版本开始,通过内置的Lua解释器,可以使用EVAL命令对Lua脚本进行求值。EVAL命令的格式如下:

    1. EVAL script numkeys [key [key ...]] [arg [arg ...]]
    2. summary: Executes a server-side Lua script.
    3. since: 2.6.0
    4. group: scripting

    script参数是一段Lua脚本程序,它会被运行在Redis服务器上下文中,这段脚本不必定义为一个Lua函数。numkeys参数用于指定键名参数的个数。键名参数[key [key ...]]从EVAL的第三个参数开始算起,表示在脚本中所用到的那些Redis键(key),这些键名参数可以在Lua中通过全局变量KEYS数组,用1为基址的形式访问(KEY[1],KEY[2],依此类推)。

    在命令最后,那些不是键名参数的附加参数[arg [arg ...]],可以在Lua中通过全局ARGV数组访问,访问的形式和KEYS变量类似(ARGV[1],ARGV[2],依此类推)。例如

    1. 127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 k1 k2 f1 f2
    2. 1) "k1"
    3. 2) "k2"
    4. 3) "f1"
    5. 4) "f2"

    其中"return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}"是被求值的Lua脚本,数字2指定了键名参数的数量,k1和k2是键名参数,分别使用KEYS[1]和KEYS[2]访问,而最后的f1和f2则是附加参数,可以通过ARGV[1]和ARGV[2]访问它们。

    在Lua脚本中,可以使用redis.call()函数来执行Redis命令

    注意:不要在Lua脚本中出现死循环和耗时的运算,否则redis会阻塞,将不接受其他的命令,所以使用时注意不能出现死循环、耗时的运算。Redis是单进程、单线程执行脚本。管道不会阻塞Redis。

    Redis缓存数据库(一)

    一个程序员最重要的能力是:写出高质量的代码!!
    有道无术,术尚可求也,有术无道,止于术。
    无论你是年轻还是年长,所有程序员都需要记住:时刻努力学习新技术,否则就会被时代抛弃!

  • 相关阅读:
    创建、检查和反编译世界上(几乎)最短的 C# 程序
    删数字问题 贪心算法 1472
    阐述 Git 命令 reset 和 revert
    Springboot微服务之zookeeper注册中心
    算法金 | 一个强大的算法模型:t-SNE !!
    【高项笔记】No.1 信息系统与信息化
    C++实现线程安全的map
    Spring框架(一)Spring核心,设计理念,创建,优缺点,使用场景···
    人大金仓数据库,可以外连SQL Server 、MySql 数据库吗?
    记一次 MSI 笔记本 GE63 播放网页视频 闪屏和随机发绿 问题解决
  • 原文地址:https://blog.csdn.net/weixin_42472027/article/details/133955366