暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis 核心要领-数据结构

码上Javaer 2025-03-02
63

Redis(Remote DIctionary Server)是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。Redis 因其高效性能而独受大厂的青睐,而且很多大厂都基于 Redis 做了二次重构以便能为自身业务提供更好的服务。本篇将重点介绍 Redis 的核心知识点-数据结构,包括字符串、散列、链表、集合、有序集合等。
01

数据结构 - 字符串(最常用的结构)


定义

    简单动态字符串(SDS-simple dynamic string)

    命令

    SET 命令

      SET key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|KEEPTTL][NX|XX][GET]

      说明:

      • EX  -- 设置具体过期时间(单位:秒)

      • PX  -- 设置具体过期时间(单位:毫秒)

      • EXAT -- 到xx时间有效(单位:秒)

      • PXAT -- 到xx时间有效(单位:毫秒)

      • NX -- 只有key不存在时才能设置

      • XX -- 只有key存在时才能设置

      • KEEPTTL -- 保留设置当前键的生存时间

      • GET -- 返回指定键原来的值,若键不存在则返回nil


      GET 命令

        GET key

        说明:

        • 获取键的值,如果键不存在则返回nil

        • 如果键的值不是字符串则返回error


        MSET 命令

          MSET key value [key value]

          说明:

          • 设置多个键为指定的值,MSET会覆盖已存在键的值。如果不想覆盖已存在的值查看MSETNX命令

          • MSET是原子操作,所以所有的key会一次设置成功。


          MGET 命令

            MGET key [key ...]

            说明:返回多个键的值,对于不包含字符串的每一个键都返回nil,基于此这个命令不会失败


            SETEX 命令

              SETEX key seconds value

              说明:相当于 SET 命令 和 EXPIRE 命令集合


              SETNX 命令

                SETNX key value

                说明:

                • 键不存在时设置键值

                • SET if Not eXists


                GETDEl 命令

                  GETDEL key

                  说明:获取指定键的值,并删除键


                  GETEX 命令

                    GETEX key [EX seconds|PX millisecondes|EXAT timestamp|PXAT milliseconds-timestamp|PERSIST]

                    说明:

                    • 获取指定键的值以及设置它的过期时间

                    • EX seconds -- 设置过期时间,单位:秒

                    • PX milliseconds -- 设置过期时间,单位:毫秒

                    • EXAT timestamp -- 设置指定的Unix时间过期,单位:秒

                    • PXAT milliseconds-timstamp -- 设置指定Unix时间过期,单位:毫秒

                    • PERSIST -- 移除键关联的TTL


                    APPEND 命令

                      APPEND key suffix

                      说明:将给定的内容追加到字符串键已有值的末尾


                      02

                      数据结构 - 散列

                      说明

                      • redis的散列键会将一个键和一个散列在数据库里关联起来,用户可以在散列中为任意多个字段(field)设置值


                      命令

                      HSET 命令

                        HSET key field value [field value ...]

                        说明:为散列中的指定字段设置值


                        HSETNX 命令

                          HSETNX key field value

                          说明:只有字段不存在时为它设置值


                          HGET 命令

                            HGET key field

                            说明:获取字段的值


                            HINCRBY 命令

                              HINCRBY key field increment

                              说明:对字段存储的整数值执行加法或减法操作


                              HINCRBYFLOAT 命令

                                HINCRBYFLOAT key field increment

                                说明:对字段存储的数字值执行浮点数加法或减法操作


                                HSTRLEN 命令

                                  HSTRLEN key field

                                  说明:获取字段值的字节长度


                                  HEXISTS 命令

                                    HEXISTS key field


                                    说明:检查字段是否存在


                                    HDEL 命令

                                      HDEL key field

                                      说明:删除字段


                                      HLEN 命令

                                        HLEN key

                                        说明:获取散列包含的字段数量


                                        HMSET 命令

                                          HMSET key field value [field value ...]

                                          说明:一次为多个字段设置值


                                          HMGET 命令

                                            HMGET key field [field ...]

                                            说明:一次获取多个字段的值


                                            HKEYS,HVALS,HGETALL

                                              HKEYS key


                                              HVALS key


                                              HGETALL key

                                              说明:

                                              • HKEYS 获取所有字段

                                              • HVALS 获取所有值

                                              • HGETALL 获取所有字段和值


                                              03

                                              数据结构 - 链表

                                              链表节点定义:

                                                typedef struct listNode {
                                                // 前置节点
                                                struct listNode * prev;
                                                // 后置节点
                                                struct listNode * next;
                                                // 节点的值
                                                void * value;
                                                }

                                                双端链表

                                                多个listNode可以通过prev和next指针组成双端链表

                                                链表

                                                虽然使用多个listNode结构可以组成链表,但使用adlist.h/list来持有链表的话,操作会更方便

                                                typedef struct list {
                                                表头节点
                                                listNode * head;
                                                表尾节点
                                                listNode * tail;
                                                链表所包含的节点数量
                                                unsigned long len;
                                                节点值复制函数
                                                void *(*dup)(void *ptr);
                                                节点值释放函数
                                                void (*free)(void *ptr);
                                                节点值对比函数
                                                int (*match)(void *ptr, void *key);
                                                }

                                                list 与 listNode关系

                                                命令

                                                LPUSH 命令

                                                  LPUSH key item [item item ...]

                                                  说明:将元素推入列表左端


                                                  RPUSH 命令

                                                    RPUSH key item [item item .....]

                                                    说明:将元素推入列表右端


                                                    LPUSHX, RPUSHX 命令

                                                      LPUSHX key item [item item ...]


                                                      RPUSHX key item [item item ...]

                                                      说明:只对已存在的列表执行推入操作


                                                      LPOP 命令

                                                        LPOP key [count]

                                                        说明:弹出count个列表最左端的元素


                                                        RPOP 命令

                                                          RPOP key [count]

                                                          说明:弹出count个列表最右端的元素


                                                          RPOPLPUSH 命令

                                                            RPOPLPUSH source target

                                                            说明:将右端弹出的元素推入左端


                                                            LLEN 命令

                                                              LLEN list

                                                              说明:获取列表的长度


                                                              LINDEX 命令

                                                                LINDEX key index

                                                                说明:获取指定索引上的元素


                                                                LRANGE 命令

                                                                  LRANGE key start stop

                                                                  说明:获取指定索引范围上的元素,包括start和stop索引对应的元素


                                                                  LSET 命令

                                                                    LSET key index element

                                                                    说明:为指定索引设置新元素


                                                                    LINSERT 命令

                                                                      LINSERT key BEFORE|AFTER  target_element element

                                                                      说明:将元素插入指定元素的前面或后面


                                                                      LTRIM 命令

                                                                        LTRIM key start end

                                                                        说明:修剪列表,移除列表中位于给定索引范围之外的所有元素


                                                                        LREM 命令

                                                                          LREM key count element

                                                                          说明:从列表中移除指定元素

                                                                          count :

                                                                          • count = 0, 移除列表中包含的所有指定元素

                                                                          • count > 0, lrem将从列表左端开始检查,并移除最先发现的count个指定元素

                                                                          • count < 0, lrem将从列表右端开始检查,并移除最先发现的abs(count)个指定元素


                                                                          未完待续~~~


                                                                              感谢大家阅读本篇文章,希望以上内容能对大家有所帮助。如果你有任何疑问或者建议,欢迎在评论区留言交流。同时,别忘了点击下方的 “在看” 和 “分享”,让更多的程序员朋友受益。后续我们还会分享更多精彩的编程知识和经验,敬请关注


                                                                          文章转载自码上Javaer,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                                          评论