Redis(li)
一、Redis基础介绍
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。不同的是redis会周期性把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。关于性能方面,redis也有一个不错的表现:官方的bench-mark数据:测试完成了50个并发执行100000个请求;设置和获取的值是一个256字节字符串;Linux box是运行Linux 2.6结果:写的速度是110000次/s,读的速度是81000次/s 。
// 安装步骤: $ wget http://redis.googlecode.com/files/redis-2.4.7.tar.gz
$ tar zxvf redis-2.4.7.tar.gz
$ cd redis-2.4.7
$ make
make命令执行完成后,会在当前目录下生成本个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-stat,它们的作用如下:
- redis-server:Redis服务器的daemon启动程序
- redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作
- redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能
- redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况。
服务端启动:
src/redis-server
客户端连接:
src/redis-cli
例子:
redis> set name helloword!
OK
redis> get name
"helloword!"
更多命令行使用可以借助help。客户端编码方式:首先引入二方包。
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.2.1</version>
</dependency>
API文档示例:http://tool.oschina.net/apidocs/apidoc?api=jedis-2.1.0
Redis存储中的key值不限长度,可以适用一些模糊查询或匹配场景。
二、Redis列表改造
性能确实很高:现在海选列表页是基于对Redis的强依赖,只读redis不读DB,如果redis没有记录或者挂了就直接返回空记录页面。在存储的优化方面,是采取直接的VO存放在redis中,上层把海选商品的id放到redis的List中做分页的索引,因为redis的列表是基于Linked list实现的,所以分页索引时间复杂度为O(S+N),S为偏移量start,N为指定区间内元素的数量,但也很快的,现在海选列表的响应时间为30ms。
http://redis.readthedocs.org/en/latest/index.html这里有各种redis的命令分析及复杂度。
Redis的数据结构及对应的操作很丰富。List的操作很不错(这次主要是用了List),这次的列表分页就是基于List的range接口实现的,可以取从start坐标到stop坐标之间range的值。在做海选列表的分页时会遇到一个小问题,因为List不支持批量的set,所以只能一个一个的push进去,但这样会导致id列表不断的变化,虽然整个过程完成得很快,但如果数量达到1k或以上的时候这种变化还是会体现到前端页面影响用户,但redis提供了一种rename的机制,这样我们在列表变化时可以先一个一个的push到一个tmp中,待push完成后再一次性的rename为正式key,这样的马上切换可以保证列表的变化不影响到前端用户。
总结:redis的操作很丰富,但也有缺陷,不过我们只要将这些丰富的命令组合一下基本上就可以很好地补充这些缺陷点。对代码的入侵。正因为redis有丰富的数据结构及操作,没有像tair那样可以用一个annotation就可以解决,所以,redis的接口会对工程的代码有一定的影响,目前只能做到在VO层的隔离。
对redis的强依赖,通过任务保证数据的实时:这次的改造尝试了另一种使用Cache的方式,就是实时的刷数据到redis(1分钟一次)这样做的好处是:
- 修改商品1分钟生效,解决了运营修改商品后要待缓存失效了才生效,以前的方式,如果是详情页还可以马上清缓存,但如果是按分页进行缓存的话,不知道这个商品在第几页,很难清,这样会造成列表页与详情页不一致的情况
- 无论运营怎样修改,都不会造成对前端用户的影响,先前首页出现过运营修改商品缓存失效后出现繁忙页面的现象,但这次海选的优化可以避免这种现象但也有不好的地方:
- 1分钟要批量读一次DB,对DB也是有点压力的
- 这种方式在凌晨没人访问的时候是一种浪费,不知有没有些更绿色一点的同步机制?大家有什么建议呢?
一些缺点:n 线上的监控要完善,如key的qps,value占的空间大小,最后有后台操作线上的KV,这样以后作为参考对一些请求次数很高的key进行优化(考虑放本地缓存等);。n 关于过期时间的操作比较不方便,ValueCommand中的multiSet接口没有过期时间参数,而单独set一个value时是有的,这点比较奇怪,而且其他的命令,在处理过期时间方面很多都要采用TedisManager来做。
跳表算法:这次在使用redis时学习了一个新的平衡数据结构---跳表,实现快速的插入和查询。
其原理和实现的复杂度比红黑树平衡树之类的都要简单。参考博客如下:
- http://kenby.iteye.com/blog/1187303
- http://www.cxphp.com/?p=241
- http://www.searchtb.com/2011/05/redis-storage.html
三、Redis命令
// Redis安装 tar zxvf redis-2.8.9.tar.gz
cd redis-2.8.9
#直接make 编译
make
#可使用root用户执行`make install`,将可执行文件拷贝到/usr/local/bin目录下。这样就可以直接敲名字运行程序了。
make install
启动
#加上`&`号使redis以后台程序方式运行
./redis-server &
检测
#检测后台进程是否存在
ps -ef |grep redis #检测6379端口是否在监听
netstat -lntp | grep 6379 #使用`redis-cli`客户端检测连接是否正常
./redis-cli
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set key "hello world"
OK
127.0.0.1:6379> get key
"hello world"
停止 #使用客户端
redis-cli shutdown
#因为Redis可以妥善处理SIGTERM信号,所以直接kill -9也是可以的
kill -9 PID
四、
五、
Redis(li)的更多相关文章
- 深入学习Redis(3):主从复制
前言 在前面的两篇文章中,分别介绍了Redis的内存模型和Redis的持久化. 在Redis的持久化中曾提到,Redis高可用的方案包括持久化.主从复制(及读写分离).哨兵和集群.其中持久化侧重解决的 ...
- Redis(五)主从复制
本文转载自编程迷思,原文链接 深入学习Redis(3):主从复制 前言 在前面的两篇文章中,分别介绍了Redis的内存模型和Redis的持久化. 在Redis的持久化中曾提到,Redis高可用的方案包 ...
- 05 redis(进阶)
redis 阶段一.认识redis 1.什么是redis Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库.Redis全称为:Remo ...
- redis(二)高级用法
redis(二)高级用法 事务 redis的事务是一组命令的集合.事务同命令一样都是redis的最小执行单元,一个事务中的命令要么执行要么都不执行. 首先需要multi命令来开始事务,用exec命令来 ...
- redis(一) 安装以及基本数据类型操作
redis(一) 安装以及基本数据类型操作 redis安装和使用 redis安装 wget http://download.redis.io/redis-stable.tar.gz tar zxvf ...
- 深入学习Redis(1):Redis内存模型
前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分. 我们使用Redis时,会接触Redis的5种对象类型(字符串 ...
- 深入学习Redis(5):集群
前言 在前面的文章中,已经介绍了Redis的几种高可用技术:持久化.主从复制和哨兵,但这些方案仍有不足,其中最主要的问题是存储能力受单机限制,以及无法实现写操作的负载均衡. Redis集群解决了上述问 ...
- 深入学习Redis(4):哨兵
前言 在 深入学习Redis(3):主从复制 中曾提到,Redis主从复制的作用有数据热备.负载均衡.故障恢复等:但主从复制存在的一个问题是故障恢复无法自动化.本文将要介绍的哨兵,它基于Redis主从 ...
- 深入学习Redis(2):持久化
前言 在上一篇文章中,介绍了Redis的内存模型,从这篇文章开始,将依次介绍Redis高可用相关的知识——持久化.复制(及读写分离).哨兵.以及集群. 本文将先说明上述几种技术分别解决了Redis高可 ...
随机推荐
- ComponentPattern (组合模式)
import java.util.LinkedList; /** * 组合模式 * * @author TMAC-J 主要用于树状结构,用于部分和整体区别无区别的场景 想象一下,假设有一批连锁的理发店 ...
- TCP/IP基础
TCP/IP 是用于因特网 (Internet) 的通信协议. 计算机通信协议是对那些计算机必须遵守以便彼此通信的规则的描述. 什么是 TCP/IP? TCP/IP 是供已连接因特网的计算机进行通信的 ...
- Idea下用SBT搭建Spark Helloworld
没用过IDEA工具,听说跟Eclipse差不多,sbt在Idea其实就等于maven在Eclipse.Spark运行在JVM中,所以要在Idea下运行spark,就先要安装JDK 1.8+ 然后加入S ...
- 分享一个php的启动关闭脚本(原)
自己简单写的一个php服务的启动脚本和大家分享 思路(实现的原理): 1:function模块+case语句多分支判断 2:通过添加# chkconfig: 2345 43 89注释实现开机自启动(前 ...
- 企业shell面试题:获取51CTO博客列表倒序排序考试题
#!/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin HTMLFILE=/home/oldboy/ht ...
- weinre- 调试移动端页面
相信很多前端的小伙伴一定会遇到一个问题, 比如我编写完一个页面,某个地方需要进行调整细节或者是哪个地方怎么调整都不对,在pc端还好,有google,firefox之类可以调节页面的工具,虽说这些工具有 ...
- ABP框架理论研究总结(典藏版)
目前,我已经完成了Module-Zero的翻译,请查看我的<Module-Zero学习目录>. 到现在为止,使用ABP框架开发正式项目已经3个月有余了,期间翻阅了大量文档资料,包括ABP官 ...
- 再来说说 LaTeX
在我的上一篇随笔中,我提到了 Markdown.LaTeX 和 MathJax.这几个东西对目前的网络技术文章的写作.展示都有深远的影响.在上一篇中,我还给出了一份 LaTeX 语法的学习资料.在这一 ...
- myeclipse学习总结三(MyEclipse文件查找技巧)
一.查找文件 使用快捷键[ctrl+shift+R]弹出弹出文件查找框,如下图所示: 二.查找包含某个字符串的文件 使用快捷键[ctrl+H]在弹出对话框中选File Search选项,然后在第一个文 ...
- float---浮动带来的影响与清除浮动带来的影响方法----在路上(20)
使用float会带来哪些影响: 脱标:无行级块级之分: 相互贴靠:若想之间有空隙可用margin与padding: 顶边对齐: 文字环绕: 当使用float后,子标签脱离父标签,父标签就会失去高度,此 ...