Redis常用命令入门——列表类型(一级二级缓存技术)
获取列表片段
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常用命令入门——列表类型(一级二级缓存技术)的更多相关文章
- Redis常用命令入门3:列表类型
列表类型 列表类型也是一个我们很长要用到的一个类型.比如我们发博客,要用到博客列表.如果没有列表我们就只能遍历键来获取所有文章或一部分文章了,这个语法是keys,但是这个命令需要遍历数据库中的所有键, ...
- Redis常用命令入门1:字符串类型命令
Redis总共有五种数据类型,在学习的时候,一定要开一个redis-cli程序,边看边练,提高效率. 一.最简单的命令 1.获得符合规则的键名列表 keys * 这里的*号,是指列出所有的键,同时*号 ...
- Redis常用命令入门5:有序集合类型
有序集合类型 上节我们一起学习了集合类型,感受到了redis的强大.现在我们接着学Redis的最后一个类型——有序集合类型. 有序集合类型,大家从名字上应该就可以知道,实际上就是在集合类型上加了个有序 ...
- Redis常用命令入门4:集合类型
集合类型 之前我们已经介绍过了最基本的字符串类型.散列类型.列表类型,下面我们一起学习一下集合类型. 集合类型也是体现redis一个比较高价值的一个类型了.因为Redis的集合类型,所以我们可以很容易 ...
- Redis常用命令入门2:散列类型
散列命令 散列类型的键值其实也是一种字典解耦,其存储了字段和字段值的映射,但字段值只能是字符串,不支持其他数据类型,所以说散列类型不能嵌套其他的数据类型.一个散列类型的键可以包含最多2的32次方-1个 ...
- Redis常用命令【列表】
一.简介 基于Linked List实现,元素是字符串类型,列表头尾增删快,中间增删慢,增删元素是常态. 元素可以重复出现,最多包含2^32-1个元素. 二.命令 1.说明 1.1 B block 块 ...
- Redis常用命令
Redis常用命令Redis提供了丰富的命令对数据库和各种数据类型进行操作,这些命令可以再Linux终端使用.1.键值相关命令2.服务器相关命令 一.键值相关命令 1.get get 键值 当 key ...
- 第2讲 Redis常用命令与高级应用
目录 一.redis数据类型 5. sorted sets类型和操作 二.Redis常用命令 1.键值相关命令 2.服务器相关命令 三. redis高级应用 1. 给redis服务器设置密码 2.持久 ...
- Redis常用命令与高级应用
附: 127.0.0.1:6379> set xiaofei 小飞 OK 127.0.0.1:6379> get xiaofei "\xe5\xb0\x8f\xe9\xa3\x9 ...
随机推荐
- MySQL start and stop
一.本文说明 本实验主要是演示MySQL的四种启动方式,附带停止的操作. 二.mysqld mysqld is the MySQL server mysqld reads options from ...
- php curl应该怎么使用呢
原php默认并不进行此项功能的扩展,但还是有的,只是没有让它生效罢了.打开PHP安装目录,搜索以下三个文件 ssleay32.dll.libeay32.dll和 php_ curl .dll,一一拷贝 ...
- HDU 4417:Super Mario(主席树)
http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意是:给出n个数和q个询问,每个询问有一个l,r,h,问在[l,r]这个区间里面有多少个数是小于等于h的 ...
- [已解决] java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.com.yourproject.test_jsp
同事遇到了一个问题,开始项目运行的好好的,过了一段时间再访问页面会报出如下错误信息(只贴了部分), 这是为啥呢,可能是由于servlet-api版本jar包重复导致的,他项目本身使用了servlet- ...
- [BIM]STEP标准和EXPRESS语言
参考:http://blog.sina.com.cn/s/blog_620be62e0100iqyb.html (BIM名词和术语(四)- IFC/STEP/EXPRESS) IFC标准使用形式化的数 ...
- 每日一九度之 题目1042:Coincidence
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3007 解决:1638 题目描述: Find a longest common subsequence of two strings. 输入 ...
- Matlab的libsvm的安装
最关键的是compilers的选择(对于把Microsoft visual stdio 2005或者其他的编译器安装在自定义目录下的这一步非常关键) 以下是步骤:>> mex -setu ...
- 关于sql状态值
C = CHECK 约束D = 默认值或 DEFAULT 约束F = FOREIGN KEY 约束L = 日志FN = 标量函数IF = 内嵌表函数P = 存储过程PK = PRIMARY KEY 约 ...
- Solr开发文档
转载:http://www.cnblogs.com/hoojo/archive/2011/10/21/2220431.html Solr 是一种可供企业使用的.基于 Lucene 的搜索服务器,它支持 ...
- 2016年11月14日 星期一 --出埃及记 Exodus 20:5
2016年11月14日 星期一 --出埃及记 Exodus 20:5 You shall not bow down to them or worship them; for I, the LORD y ...