• Redis存取架构及命令详解


    Redis架构原理

    键值存储是一种存储系统,其中的数据以键和值对的形式存储。当我们说内存中键值存储时,是指键值对存储在主存储器(RAM)中。因此,可以说Redis以键值对的形式将数据存储在RAM中。

    数据库管理系统将所有内容存储在磁盘中,这使得读取和写入操作非常慢。但是Redis将所有内容存储在主存储器中,这在数据读写中非常快。

    但是,我们知道内存是远比磁盘贵的,而且计算机的磁盘一般较大,内存相对很小。所以,如果redis像数据库一样存储大量数据,会导致计算机内存耗尽。因此,redis往往存储少量高频度读写的数据,并且会配置过期。

    1.1 redis存取架构图

    1.2 redis存取说明

    redis存储数据主要有String,List,Hash,Set,Zset五种数据类型。数据存储默认有16个db,默认选中为第一个db。db选择按0~15的数字标识切换。每一种数据类型都会有对应的存取命令。

    1.3 安装使用

    1. Linux安装
    2. yum install redis

    安装后,配置文件所在路径:/etc/redis.conf

    service redis start

    启动时,redis会占用端口6379

    shell下面,直接运行redis-cli,就可以进入客户端连接 

    Windows安装 

    zip文件解压

    配置环境变量:将redis安装目录添加到path变量

    进入Redis安装目录,安装服务:

    redis-server --service-install redis.windows.conf --loglevel verbose

     启动服务:需要使用管理员运行cmd或者powshell

    停止服务: 

    卸载服务:(备注,若只是安装,请不要卸载)

    redis-server --service-uninstall

    客户端连接:(先启动服务哟)

     

    Redis常用命令

    1. 127.0.0.1:6379> info
    2. # Server
    3. redis_version:5.0.3
    4. redis_git_sha1:00000000
    5. redis_git_dirty:0
    6. redis_build_id:9529b692c0384fb7
    7. redis_mode:standalone
    8. os:Linux 4.18.0-240.22.1.el8_3.x86_64 x86_64
    9. ……

     

    1. # 选择db
    2. 127.0.0.1:6379> select 1
    3. OK
    4. # 查看所有键(可以筛选)
    5. 127.0.0.1:6379> keys *
    6. 1) "will"
    7. 2) "backup3"
    8. 3) "backup2"
    9. 4) "backup1"
    10. # 设置(更新)键值
    11. 127.0.0.1:6379> set will hello
    12. OK
    13. # 获取键值
    14. 127.0.0.1:6379> get will
    15. "hello"
    16. # 设置键和过期时间
    17. 127.0.0.1:6379> setex will1 100 0
    18. OK
    19. # 获取键的剩余时间
    20. 127.0.0.1:6379> ttl will1
    21. (integer) 17
    22. # 整数自增操作
    23. 127.0.0.1:6379> incr will1
    24. (integer) 1
    25. 127.0.0.1:6379> get will1
    26. "1"
    27. # 删除键
    28. 127.0.0.1:6379> del will1
    29. (integer) 1
    30. 127.0.0.1:6379> get will1
    31. (nil)

    Redis数据结构和命令

    3.1 String-字符串

    字符串 string 是 Redis 最简单的数据结构。基础数据都以字符串形式存储。

    其对应的命令就set-get,mset-mget

    1. # 单个操作
    2. 127.0.0.1:6379> set will 1
    3. OK
    4. 127.0.0.1:6379> get will
    5. "1"
    6. 127.0.0.1:6379> set will 1.1
    7. OK
    8. 127.0.0.1:6379> get will
    9. "1.1"
    10. 127.0.0.1:6379> set will abc
    11. OK
    12. 127.0.0.1:6379> get will
    13. "abc"
    14. # 批量操作
    15. 127.0.0.1:6379> mset will 1 roy 2 tufei 3
    16. OK
    17. 127.0.0.1:6379> mget will roy tufei
    18. 1) "1"
    19. 2) "2"
    20. 3) "3"

    3.2 List-链表(列表)

    相当于C里面的双向链表或者python里面的列表

    list的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为O(n)

    List有三类用法

    队列用法:右进左出

    1. 127.0.0.1:6379> rpush queue 1 2 3 4 5
    2. (integer) 5
    3. 127.0.0.1:6379> llen queue
    4. (integer) 5
    5. 127.0.0.1:6379> lpop queue
    6. "1"
    7. 127.0.0.1:6379> lpop queue
    8. "2"
    9. 127.0.0.1:6379> lpop queue
    10. "3"
    11. 127.0.0.1:6379> lpop queue
    12. "4"
    13. 127.0.0.1:6379> lpop queue
    14. "5"
    15. 127.0.0.1:6379> lpop queue
    16. (nil)

    栈的用法:右进右出

    1. 27.0.0.1:6379> rpush stack 1 2 3
    2. (integer) 3
    3. 127.0.0.1:6379> llen stack
    4. (integer) 3
    5. 127.0.0.1:6379> rpop stack
    6. "3"
    7. 127.0.0.1:6379> rpop stack
    8. "2"
    9. 127.0.0.1:6379> rpop stack
    10. "1"
    11. 127.0.0.1:6379> rpop stack
    12. (nil)

    列表用法:慢用法

    像Python的列表一样,通过下标使用List。这种用法需要对链表进行遍历,性能随着参数 index 增大而变差。

    1. 127.0.0.1:6379> rpush list 1 2 3 4 5
    2. (integer) 5
    3. 127.0.0.1:6379> llen list
    4. (integer) 5
    5. # 下标获取
    6. 127.0.0.1:6379> lindex list 1
    7. "2"
    8. # 获取下标之间的元素,闭区间
    9. 127.0.0.1:6379> lrange list 1 3
    10. 1) "2"
    11. 2) "3"
    12. 3) "4"
    13. # 保留下标之间的元素,闭区间(其他元素会删掉)
    14. 127.0.0.1:6379> ltrim list 1 3
    15. OK
    16. # 获取所有元素
    17. 127.0.0.1:6379> lrange list 0 -1
    18. 1) "2"
    19. 2) "3"
    20. 3) "4"

    3.3 Hash-字典

    1. 127.0.0.1:6379> hset teacher will python
    2. (integer) 1
    3. 127.0.0.1:6379> hset teacher Roy java
    4. (integer) 1
    5. 127.0.0.1:6379> hset teacher tufei xingneng
    6. (integer) 1
    7. 127.0.0.1:6379> hgetall teacher
    8. 1) "will"
    9. 2) "python"
    10. 3) "Roy"
    11. 4) "java"
    12. 5) "tufei"
    13. 6) "xingneng"
    14. # 因为是更新,所有是0
    15. 127.0.0.1:6379> hset teacher tufei 性能
    16. (integer) 0
    17. # 对于字典,键的值也可以自增
    18. 127.0.0.1:6379> hset teacher age 1
    19. (integer) 1
    20. 127.0.0.1:6379> hincrby teacher age 1
    21. (integer) 2
    22. 127.0.0.1:6379> hget teacher age
    23. "2"

     

    3.4 set-集合

    set 是一个无序的、自动去重的集合数据类型

    常见应用为抽奖,可以确保同一个用户不会抽中两次

    1. 127.0.0.1:6379> sadd 特斯汀 1 2 a
    2. (integer) 3
    3. # 重复,不添加
    4. 127.0.0.1:6379> sadd 特斯汀 1
    5. (integer) 0
    6. # 新增
    7. 127.0.0.1:6379> sadd 特斯汀 b
    8. (integer) 1
    9. # 注意,并不是添加的顺序,因为set是无序的
    10. 127.0.0.1:6379> smembers 特斯汀
    11. 1) "a"
    12. 2) "2"
    13. 3) "b"
    14. 4) "1"
    15. # 查询某个元素是否存在
    16. 127.0.0.1:6379> sismember 特斯汀 a
    17. (integer) 1
    18. 127.0.0.1:6379> sismember 特斯汀 c
    19. (integer) 0
    20. 127.0.0.1:6379> scard 特斯汀
    21. (integer) 4
    22. # 弹出一个,被弹出元素将被删除
    23. 127.0.0.1:6379> spop 特斯汀 1
    24. 1) "1"
    25. 127.0.0.1:6379> smembers 特斯汀
    26. 1) "a"
    27. 2) "2"
    28. 3) "b"

    3.5 zset-有序集合

    zset 可能是 Redis 提供的最为特色的数据结构,它也是在面试中面试官最爱问的数据结构。

    它会自动去重,并对所有元素进行排序

    其应用场景也很广泛,比如成绩排名,动态排行等等

    1. 127.0.0.1:6379> zadd score 80 will
    2. (integer) 1
    3. 127.0.0.1:6379> zadd score 88 roy
    4. (integer) 1
    5. 127.0.0.1:6379> zadd score 77 tufei
    6. (integer) 1
    7. # 按成绩升序输出
    8. 127.0.0.1:6379> zrange score 0 -1
    9. 1) "tufei"
    10. 2) "will"
    11. 3) "roy"
    12. # 按成绩降序输出
    13. 127.0.0.1:6379> zrevrange score 0 -1
    14. 1) "roy"
    15. 2) "will"
    16. 3) "tufei"
    17. 127.0.0.1:6379> zcard score
    18. (integer) 3
    1. # 通过value获取到分数
    2. 127.0.0.1:6379> zscore score will
    3. "80"
    4. # 获取区间内排名
    5. 127.0.0.1:6379> zrangebyscore score 80 90
    6. 1) "will"
    7. 2) "roy"
    8. # inf 是无穷大的意思(∞)
    9. 127.0.0.1:6379> zrangebyscore score -inf 80
    10. 1) "tufei"
    11. 2) "will"
    12. # 删除
    13. 127.0.0.1:6379> zrem score will
    14. (integer) 1
    15. 127.0.0.1:6379> zrange score 0 -1
    16. 1) "tufei"
    17. 2) "roy"

     

  • 相关阅读:
    内衣洗衣机有必要买吗?口碑好的小型洗衣机测评
    Java-1123
    1382. 将二叉搜索树变平衡 ●●
    解决Jenkins执行git脚本时报错:No such device or address问题
    【HTML小游戏】推箱子网页版(附完整源码)
    【【萌新的SOC学习之绪论】】
    微信迎来史诗级更新,以及两款微信清理工具
    GPT的历史
    Ubuntu下安装node.js遇到的问题记录
    Auto.js java布局 转 UI 布局,自己定义uii.layout()
  • 原文地址:https://blog.csdn.net/m0_67698950/article/details/125503844