Redis常用命令入门——列表类型(一级二级缓存技术)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 获取列表片段redis 127.0.0.1:6379> LRANGE KEY_NAME START ENDlrange命令比较常用,返回从start到stop的所有元素的列表,start和stop都是从0开始。

获取列表片段

redis 127.0.0.1:6379> LRANGE KEY_NAME START END

lrange命令比较常用,返回从start到stop的所有元素的列表,start和stop都是从0开始。

(1)查询所有(获取全部列表):LRANGE KEY_NAME 0 -1

1.41.88.9:63789[1]> LRANGE myList2 0 -1
 1) "b"
 2) "e"
 3) "g"
 4) "b"
 5) "f"
 6) "e"
 7) "b"
 8) "d"
 9) "c"
10) "b"
11) "e"
12) "a"
13) "d"
14) "c"
15) "b"
16) "a"

(2)查询前两个:LRANGE KEY_NAME 0 2

12.4.8.2:63789[1]> LRANGE myList2 -2 -1
1) "b"
2) "a"

(3)lrange还支持负值索引,这里是负值大家可以把负号加值直接理解成从从右数第多少个,要是执行lrange numbers -2 -1,就会得到最后两个值。

(4)查询倒数3个:LRANGE KEY_NAME  -3 -1

1.1.88.2:63789[1]> LRANGE myList2 -3 -1
1) "c"
2) "b"
3) "a"

这里有两点要注意一下:

(1)如果start索引比stop索引位置靠后(这里说的是位置,不是索引值的大小),则会返回空列表(empty list or set)。

(2)如果stop大于实际的索引范围,则会返回列表最后边的元素。

删除列表中指定值

redis 127.0.0.1:6379> LREM KEY_NAME COUNT VALUE

Redis Lrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素

COUNT 的值可以是以下几种:

  • count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
  • count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
  • count = 0 : 移除表中所有与 VALUE 相等的值。

返回值是删除值的个数。

删除倒数2个值:

11.1.88.9:63789[1]> LREM mylist -2 hello 
(integer) 2

删除顺序的1个值:

11.4.88.9:63789[1]> LREM mylist 1 hello 
(integer) 1

只保留列表中指定的片段

Redis Ltrim 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。

下标 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

redis 127.0.0.1:6379> LTRIM KEY_NAME START STOP

Ltrim 剪切注意事项:

【1】从左边开始剪切是从:0 开始 ,这样的话可以按照数组下标的方式去获取存储就可以了。0就是第一个元素哦

【2】从右边剪切是从:-1 开始的,-1就是倒数第一个元素哦!

查询所有元素:

12.1.88.2:6389[1]> LRANGE mylist 0 -1
1) "33333333333"
2) "44444444444"
3) "4555555555555"
4) "66666666666"
5) "88888888888"
6) "9999999999"

例如:只截取中间的两个值:

3) "4555555555555"
4) "66666666666"

可以这么做:

11.4.88.209:6389[1]> LTRIM mylist 2 -3  左边第三个元素开始和右边第三个元素开始
OK
11.41.8.29:6389[1]> LRANGE mylist 0 -1
1) "4555555555555"
2) "66666666666"
11.1.88.9:6389[1]> 

 原始数据:

11.1.8.29:6389[1]> LRANGE mylist 0 -1
1) "4555555555555"
2) "66666666666"
3) "9999999999"
4) "7777777777"
5) "88888888888"
6) "555555555"
7) "4444444444"

只截取前面的5条数据:

11.1.8.209:6389[1]> LTRIM mylist 0 4 // 0~4 刚好5个元素
OK
11.41.88.209:6389[1]> LRANGE mylist 0 -1  //查看所有列表
1) "4555555555555"
2) "66666666666"
3) "9999999999"
4) "7777777777"
5) "88888888888"

利用链表实现文章列表页缓存

通常的文章列表,每次都要访问数据库,数据库压力很大,一个分页条件的不同页面之间数据无法共享。一旦数据库出问题时,整个页面随之无法访问。

怎么办?可以增加memcache缓存。每一页做一个缓存,例如10分钟。但是多页之间,可能你先缓存,我后缓存,数据就会出现不一致的情况。而且每一页的缓存创建都需要访问数据库。如果将所有结果缓存起来,每次读取出整个缓存再分析出分页数据,不仅性能不高,服务器网卡也将承受巨大的流量压力。

而redis的链表功能,能基本完美的解决这些问题。

将mysql查询出的列表的全部文章id都保存到一个链表里,需要访问第N页时,只需要lrange出对应的PAGE_SIZE个文章id,然后再从缓存中读取这PAGE_SIZE个文章的信息。列表就完成了。下次访问的时候,就完全不需要数据库,直到缓存失效。并且一次读取,所有分页都共用该缓存。不仅提高了效率,还保证了分页间的数据一致。文章信息,也再从数据库读取之后,保存到redis中。

对于访问频繁且从数据库读取代价比较大的数据,一旦缓存失效,将有多个并发去请求数据库,给数据库带来很大的压力。这时可以给列表缓存(命名为list)再加个存活缓存(命名为live)。list永不过期,而live存活时间只有10分钟。每次先lrange请求出需要的数据,再检测live是否存在。如果不存在就先重新设置live,然后再从数据库读取列表,重新设置list。这样的好处就是,只有第一个检测到live失效的请求会访问数据库,其他并发请求访问的是缓存数据。

这个方法带来的另一个好处是,即使数据库宕机,列表仍然能正常访问

获取Redis数据批量的保存到Redis中去解析Redis数据的json格式

 public function RedisSaveToMysqlJsonAction()
    {
        $redis = RedisInstance::getInstance();
        $redis->select(1);
        $redisInfo = $redis->lRange('message01',0,9);
        $dataLength = $redis->lLen('message01');
        $redis->set('dataLength_front',$dataLength);
        while($dataLength > 20) {
            try {
                $this->db->begin();
                foreach ($redisInfo as $action) {
                    $sql = "INSERT INTO stream_name (name,createTime,userId,content) VALUES (?, ? ,? ,?)";
                    $this->db->execute($sql, array(
                        json_decode($action,true)['userName'],
                        json_decode($action,true)['createTime'],
                        json_decode($action,true)['userId'],
                        json_decode($action,true)['content'],
                    ));
                }
                $redis->set('message_insert_success', '00000');
                $redis->lTrim('message01', 10, -1);
                $redisInfo = $redis->lRange('message01',0,9);
                $dataLength = $redis->lLen('message01');
                $redis->set('dataLength_backenk', $dataLength);
                $this->db->commit();
            } catch (\Exception $e) {
                $redis->set('message_catch', json_encode($e));
                $this->db->rollback();
            }
        }
        var_dump($redisInfo);
        die;
    }

 

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
2月前
|
存储 缓存 监控
Redis设计与实现——Redis命令参考与高级特性
Redis 是一个高性能的键值存储系统,支持丰富的数据类型(字符串、列表、哈希、集合等)和多种高级功能。本文档涵盖 Redis 的核心命令分类,包括数据类型操作、事务与脚本、持久化、集群管理、系统监控等。特别介绍了事务的原子性特性、Lua 脚本的执行方式及优势、排序机制、发布订阅模型以及慢查询日志和监视器工具的使用方法。适用于开发者快速掌握 Redis 常用命令及其应用场景,优化系统性能与可靠性。
|
2月前
|
缓存 NoSQL Java
Redis+Caffeine构建高性能二级缓存
大家好,我是摘星。今天为大家带来的是Redis+Caffeine构建高性能二级缓存,废话不多说直接开始~
363 0
|
2月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
125 32
|
2月前
|
缓存 NoSQL Java
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
76 5
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
|
2月前
|
存储 缓存 NoSQL
Redis中的常用命令-get&set&keys&exists&expire&ttl&type的详细解析
总的来说,这些Redis命令提供了处理存储在内存中的键值对的便捷方式。通过理解和运用它们,你可以更有效地在Redis中操作数据,使其更好地服务于你的应用。
237 17
|
2月前
|
消息中间件 NoSQL Linux
Redis的基本介绍和安装方式(包括Linux和Windows版本),以及常用命令的演示
Redis(Remote Dictionary Server)是一个高性能的开源键值存储数据库。它支持字符串、列表、散列、集合等多种数据类型,具有持久化、发布/订阅等高级功能。由于其出色的性能和广泛的使用场景,Redis在应用程序中常作为高速缓存、消息队列等用途。
680 16
|
2月前
|
JSON NoSQL Redis
在Rocky9系统上安装并使用redis-dump和redis-load命令的指南
以上步骤是在Rocky9上使用redis-dump和redis-load命令顺利出行的秘籍。如果在实行的过程中,发现了新的冒险和挑战,那么就像一个勇敢的航海家,本着探索未知的决心,解决问题并前进。
70 14
|
2月前
|
消息中间件 NoSQL Unix
Redis的基本特性以及其基础命令用法
这只是冰山一角,Redis的强大功能和简洁的操作方法值得我们深入了解和掌握,是复杂数据问题解决的有力工具。所以,来一场有趣的Redis冒险吧!
120 6
|
4月前
|
缓存 监控 NoSQL
Redis--缓存击穿、缓存穿透、缓存雪崩
缓存击穿、缓存穿透和缓存雪崩是Redis使用过程中可能遇到的常见问题。理解这些问题的成因并采取相应的解决措施,可以有效提升系统的稳定性和性能。在实际应用中,应根据具体场景,选择合适的解决方案,并持续监控和优化缓存策略,以应对不断变化的业务需求。
214 29