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

获取列表片段

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;
    }

 

时间: 2024-09-19 21:44:48

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

第2讲 Redis常用命令与高级应用

目录 一.redis数据类型 5. sorted sets类型和操作 二.Redis常用命令 1.键值相关命令 2.服务器相关命令 三. redis高级应用 1. 给redis服务器设置密码 2.持久化 3.主从备份 一.redis数据类型 5. sorted sets类型和操作 sorted set是set的一个升级版本,它给集合中每个元素都定义一个分数,集合中的元素按照其分数排序. 1) zadd 键 分数1 值1 [分数2 值2-] 该命令添加指定的成员到key对应的有序集合中,每个成员都

redis常用命令小结_Redis

1.redis-benchmark redis基准信息,redis服务器性能检测 redis-benchmark -h localhost -p 6379 -c 100 -n 100000 100个并发连接,100000个请求,检测host为localhost 端口为6379的redis服务器性能 [root@Architect redis-1.2.6]# redis-benchmark -h localhost -p 6379 -c 100 -n 100000 ====== PING ====

orm-在Hibernate中配置了SessionFactory,是不是就已经启动了一级二级缓存功能?

问题描述 在Hibernate中配置了SessionFactory,是不是就已经启动了一级二级缓存功能? 一级缓存在什么时候启用? 二级缓存在什么时候启用? 解决方案 一级缓存默认已经启用 二级缓存默认关闭(要开启二级缓存得自己手动配置然后再启用) 可参见:http://blog.csdn.net/hekewangzi/article/details/45873271 解决方案二: Hibernate一级二级缓存Hibernate的一级和二级缓存hibernate二级缓存配置 解决方案三: 二级

redis常用命令、常见错误、配置技巧等分享_Redis

1. redis查看当前所有的key 复制代码 代码如下: KEYS * 2. 查看当前redis的配置信息 复制代码 代码如下: CONFIG GET * 3. MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis

Redis——常用命令操作

 一,启动   Centos6       进入到redis安装目录: cd redis-2.8.17     进入src目录: cd src     启动server:  ./redis-server    使用配置文件启动: ./redis-serverredis.conf      Ubuntu 启动server:redis-server 启动客户端:redis-cli    Windows   redis-cli.exe-h 127.0.0.1 -p 6379 二,使用命令对Redis基

Hibernate+ehcache二级缓存技术

1.首先设置EhCache,建立配置文件ehcache.xml,默认的位置在class-path,可以放到你的src目录下: <?xml version="1.0" encoding="UTF-8"?> <ehcache> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000" <!

Redis集合类型的常用命令小结_Redis

集合类型介绍 集合类型也是体现redis一个比较高价值的一个类型了.因为Redis的集合类型,所以我们可以很容易的在Redis中执行差集运算.交集运算.并集运算. 首先我们先介绍一下集合类型和列表类型的区别,其实学过面向对象的语言的同学应该都能猜到这些类型有什么不同.      ①集合类型和列表类型还是都能存储2^32-1个字符串      ②集合类型是无序的,列表类型是有序的      ③集合类型是唯一的,列表类型的值是不唯一的 下面我们一起来看一下语法. 1.增加删除元素命令 sadd ke

Redis字符串类型的常用命令小结_Redis

Redis字符串类型 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等.在Redis中字符串类型的Value最多可以容纳的数据长度是512M. 一.最简单的命令 1.获得符合规则的键名列表 keys * 这里的*号,是指列出所有的键,同时*号也可以替换成其他支持glob风格通配符格式,具体规则如下:      ?:匹配一个字符      *:匹配任意个(包括0个)字符      []

Redis中散列类型的常用命令小结_Redis

Redis散列类型 Redis是采用字典结构以键值对的形式存储数据的,而散列类型(hash)的键值也是一种字典结构,其存储了字段和字段值的映射,但字段值只能是字符串,不支持其他数据类型,也就是说,散列类型不能嵌套其他的数据类型.一个散列类型键可以包含至多2^32-1个字段. 除了散列类型,Redis的其他数据类型同样不支持数据类型嵌套.比如集合类型的每个元素只能是字符串,不能是一个集合或者散列表等. 散列类型适合存储对象:使用对象类别和ID构成建名,使用字段表示对象的属性,而字段值存储属性值.例