获取列表片段

redis 127.0.0.1:> LRANGE KEY_NAME START END

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

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

1.41.88.9:[]> LRANGE myList2  -
) "b"
) "e"
) "g"
) "b"
) "f"
) "e"
) "b"
) "d"
) "c"
) "b"
) "e"
) "a"
) "d"
) "c"
) "b"
) "a"

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

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

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

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

1.1.88.2:[]> LRANGE myList2 - -
) "c"
) "b"
) "a"

这里有两点要注意一下:

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

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

删除列表中指定值

redis 127.0.0.1:> 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:[]> LREM mylist - hello
(integer)

删除顺序的1个值:

11.4.88.9:[]> LREM mylist  hello
(integer)

只保留列表中指定的片段

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

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

redis 127.0.0.1:> LTRIM KEY_NAME START STOP

Ltrim 剪切注意事项:

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

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

查询所有元素:

12.1.88.2:[]> LRANGE mylist  -
) ""
) ""
) ""
) ""
) ""
) ""

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

) ""
) ""

可以这么做:

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

原始数据:

11.1.8.29:[]> LRANGE mylist  -
) ""
) ""
) ""
) ""
) ""
) ""
) ""

只截取前面的5条数据:

11.1.8.209:[]> LTRIM mylist  4 // 0~4 刚好5个元素
OK
11.41.88.209:[]> LRANGE mylist -1 //查看所有列表
) ""
) ""
) ""
) ""
) ""

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

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

怎么办?可以增加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常用命令入门——列表类型(一级二级缓存技术)的更多相关文章

  1. Redis常用命令入门3:列表类型

    列表类型 列表类型也是一个我们很长要用到的一个类型.比如我们发博客,要用到博客列表.如果没有列表我们就只能遍历键来获取所有文章或一部分文章了,这个语法是keys,但是这个命令需要遍历数据库中的所有键, ...

  2. Redis常用命令入门1:字符串类型命令

    Redis总共有五种数据类型,在学习的时候,一定要开一个redis-cli程序,边看边练,提高效率. 一.最简单的命令 1.获得符合规则的键名列表 keys * 这里的*号,是指列出所有的键,同时*号 ...

  3. Redis常用命令入门5:有序集合类型

    有序集合类型 上节我们一起学习了集合类型,感受到了redis的强大.现在我们接着学Redis的最后一个类型——有序集合类型. 有序集合类型,大家从名字上应该就可以知道,实际上就是在集合类型上加了个有序 ...

  4. Redis常用命令入门4:集合类型

    集合类型 之前我们已经介绍过了最基本的字符串类型.散列类型.列表类型,下面我们一起学习一下集合类型. 集合类型也是体现redis一个比较高价值的一个类型了.因为Redis的集合类型,所以我们可以很容易 ...

  5. Redis常用命令入门2:散列类型

    散列命令 散列类型的键值其实也是一种字典解耦,其存储了字段和字段值的映射,但字段值只能是字符串,不支持其他数据类型,所以说散列类型不能嵌套其他的数据类型.一个散列类型的键可以包含最多2的32次方-1个 ...

  6. Redis常用命令【列表】

    一.简介 基于Linked List实现,元素是字符串类型,列表头尾增删快,中间增删慢,增删元素是常态. 元素可以重复出现,最多包含2^32-1个元素. 二.命令 1.说明 1.1 B block 块 ...

  7. Redis常用命令

    Redis常用命令Redis提供了丰富的命令对数据库和各种数据类型进行操作,这些命令可以再Linux终端使用.1.键值相关命令2.服务器相关命令 一.键值相关命令 1.get get 键值 当 key ...

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

    目录 一.redis数据类型 5. sorted sets类型和操作 二.Redis常用命令 1.键值相关命令 2.服务器相关命令 三. redis高级应用 1. 给redis服务器设置密码 2.持久 ...

  9. Redis常用命令与高级应用

    附: 127.0.0.1:6379> set xiaofei 小飞 OK 127.0.0.1:6379> get xiaofei "\xe5\xb0\x8f\xe9\xa3\x9 ...

随机推荐

  1. Temporary TempDB Tables [AX 2012]

    Temporary TempDB Tables [AX 2012] 1 out of 4 rated this helpful - Rate this topic Updated: November ...

  2. MySQL 获得当前日期时间 函数

    获得当前日期+时间(date + time)函数:now() mysql> select now(); +---------------------+ | now() | +---------- ...

  3. ALTFP_CONVERT IP使用与仿真

    ALTFP_CONVERT IP使用与仿真   近期项目要使用到整型数据转浮点型数据,将16位的整数转换为单精度浮点数(32bit).本打算自己写逻辑实现的,不过考虑到本身项目时间紧,能力也有限,就没 ...

  4. Docker第三方项目小结

    软件项目的成功常常根据其催生的生态系统来衡量.围绕或基于核心技术构建的项目增添了功能和易用性,它们常常日臻完善.Docker就是一个典例,有众多第三方项目扩展.补充或改进Docker. •Docker ...

  5. Codeforces 733C:Epidemic in Monstropolis(暴力贪心)

    http://codeforces.com/problemset/problem/733/C 题意:给出一个序列的怪兽体积 ai,怪兽只能吃相邻的怪兽,并且只有体积严格大于相邻的怪兽才能吃,吃完之后, ...

  6. Spring+Quartz实现定时执行任务的配置

    1.要想使用Quartz 必须要引入相关的包:以下是我在项目中gradle中的配置: compile 'org.quartz-scheduler:quartz:2.1.1' 2.Scheduler的配 ...

  7. Spring MVC 的汉字乱码问题

    在web.xml文件加入 <filter> <filter-name>characterEncodingFilter</filter-name> <filte ...

  8. 【转】学习总结--Cookie & Session总结

    转载地址:http://www.phperzone.cn/portal.php?aid=718&mod=view 一.状态管理 1)什么是状态管理?   将浏览器与web服务器之间多次交互过程 ...

  9. laravel 重写以及500错误

    http://www.golaravel.com/laravel/docs/5.1/ sudo chmod 755 -R laravel chmod -R o+w laravel/storage

  10. 2016-2017 CT S03E05: Codeforces Trainings Season 3 Episode 5 (2016 Stanford Local Programming Contest, Extended) B

    链接:http://codeforces.com/gym/101116 学弟做的,以后再补 #include <iostream> #include <stdio.h> #in ...