母婴网站模板,网页升级紧急通知页面,企业宣传方式,ftp怎么做网站个人主页 #xff1a; 个人主页 个人专栏 #xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言命令LPUSH 和 LPUSHXLRANGERPUSH 和 RPUSHXLPOP 和 RPOPLINDEXLINSERTLLENLREMLTRIMLSET阻塞版命令BLPOP 和 BRPOP 内部编码总结 前言
列… 个人主页 个人主页 个人专栏 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言命令LPUSH 和 LPUSHXLRANGERPUSH 和 RPUSHXLPOP 和 RPOPLINDEXLINSERTLLENLREMLTRIMLSET阻塞版命令BLPOP 和 BRPOP 内部编码总结 前言
列表类型是用来存储多个有序的字符串列表中的每个字符串称为元素列表是一种灵活的数据结构可以充当栈和队列。
下图为列表两端插入和弹出操作 下图为列表的获取和删除等操作 注意 约定最左侧元素下标是0 redis的下标支持负数下标 list 并非是一个简单的数组而是更接近于双端队列
列表类型的特点
列表中的元素是有序的有序表示元素的顺序很重要。相同元素不同顺序是不同的列表列表中的元素是允许重复的 命令
LPUSH 和 LPUSHX
将一个或者多个元素从左侧(头插)放入到list中 LPUSH key element [element … ] 返回值插入后list的长度 时间复杂度O(N)N为插入元素个数 在key存在时将一个或者多个元素从左侧放入(头插)到list中。不存在直接返回 LPUSHX key element [element … ] 返回值插入后list的长度 时间复杂度O(N)N为插入元素个数 注意 如果key已经存在并且key对应的value类型不是list此时lpush命令就会报错 redis 中所有的这些各种数据类型的操作都是类似的效果 LRANGE
获取从 start 到 end 区间所有元素左闭右闭。 LRANGE key start stop 返回值指定区间的元素 时间复杂度O(N) redis并没有提供 rrange 命令 注意 redis处理下标是直接尽可能的获取到给定区间的元素如果给定区间非法比如超出下标就会尽可能的获取对应的内容。 RPUSH 和 RPUSHX
将一个或者多个元素从右侧放入(尾插)到list中 RPUSH key element [ element … ] 返回值插入后list的长度 时间复杂度O(N)N为插入元素个数 在 key 存在时将一个或多个元素从右侧放入(尾插)到list中不存在直接返回 RPUSHX key element [ element … ] 返回值插入后list的长度 时间复杂度O(N)N为插入元素个数 LPOP 和 RPOP
从list左侧取出元素(头删) LPOP key 返回值取出的元素或者nil 时间复杂度O(1) 从list右侧取出元素(尾删) RPOP key 返回值取出的元素或者nil 时间复杂度O(1) 注意 redis中的list是一个双端队列从两头插入/删除元素都是O(1)搭配使用 rpush 和 lpop 就相当于 队列搭配使用 rpush 和 rpop 就相当于 栈。 LINDEX
获取从左数第index位置的元素 LINDEX key index 返回值取出的元素 或者 nil 时间复杂度O(N)N为list的长度 LINSERT
在特定位置插入元素 LINSERT key BEFORE | AFTER pivot element 返回值插入后的list长度 时间复杂度O(N)N为list的长度 注意 如果要插入的列表中基准值存在多个怎么办insert进行插入时要根据基准值找到对应的位置。从左往右找找到第一个符合基准值的位置即可。 LLEN
获取 list 长度 LLEN key 返回值list的长度 时间复杂度O(1) LREM
移除list中指定数量的与给定值相等的元素 LREM key count value 返回值被移除元素的数量 时间复杂度O(N)N为list的长度
count 0从列表左侧开始移除与 value 相等的最多 count个元素count 0从列表尾部开始移除与 value 相等的最多 count个元素count 0移除列表中所有与value相等的元素 LTRIM
保留 start 和 stop 之间区间内的元素(区间两边的元素直接删除) LTRIM key start stop 返回值成功返回“OK” 时间复杂度O(N)N为被移除的元素数量 注意 redis6 开始支持 ACL(access control list 访问控制列表)也就是权限。 redis由很多命令acl把每个命令都打上标签管理员就可以给每个redis用户配置不同的权限(允许 该用户 可以执行那些标签对应的命令) LSET
将列表key中下标为index的元素的值设置为element LSET key index element 返回值成功返回“OK”失败返回错误信息 时间复杂度O(N)N为列表的长度 阻塞版命令
blpop 和 brpop 是 lpop 和 rpop 的阻塞版本。
在列表中有元素的情况下阻塞和非阻塞表现是一致的。如果列表中没有元素非阻塞版本会立即返回nil但阻塞版本会根据timeout阻塞一段时间期间redis可以执行其它命令但要求执行该命令的客户端要表现为阻塞状态命令中如果设置了多个键那么会从左向右进行遍历键一但有一个键对应的列表可以弹出元素命令立即返回如果多个客户端同时对一个键执行pop则最先执行命令的客户端会得到弹出元素
redis中的list也相当于 阻塞队列 一样线程安全是通过单线程模型支持的阻塞则只支持队列为空的情况不考虑队列满了 BLPOP 和 BRPOP BLPOP key [key …] timeout BRPOP key [key …] timeout 如果这些list有任何一个非空blpop都能够把这里的元素给获取到立即返回 如果这些list都为空此时需要阻塞等待等待其它客户端向这些list插入元素 可以指定超时时间单位是 秒 (redis 6 超时时间允许设定为小数redis 5 超时时间要是整数)
brpop效果和blpop类似
针对一个非空的列表进行操作 返回结果相当于一个pair(二元组)一方面告诉我们当前的数据来自哪个key一方面告诉我们取到的数据是什么针对一个空的列表进行操作 针对多个key进行操作 内部编码
之前list类型的内部编码实现有两种
ziplist(压缩列表)当列表的元素个数小于 list-max-ziplist-entries 配置同时列表中每个元素的长度都小于 list-max-ziplist-value 配置时redis会选用ziplist来作为列表内部编码实现来减小内存消耗linkedlist(链表)当列表类型无法满足ziplist的条件时redis会使用linkedlist作为列表内部实现
现在list类型内部使用quicklist实现 quicklist是一个双向链表但它的节点是压缩列表每个quicklist节点都包含一个ziplistziplist中存储了list类型的数据元素。这种设计即保持了双向链表的插入和删除优势又通过压缩列表提高了内存利用率 总结
以上就是我的redis学习笔记