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,它们的作用如下:

  1. redis-server:Redis服务器的daemon启动程序
  2. redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作
  3. redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能
  4. 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分钟生效,解决了运营修改商品后要待缓存失效了才生效,以前的方式,如果是详情页还可以马上清缓存,但如果是按分页进行缓存的话,不知道这个商品在第几页,很难清,这样会造成列表页与详情页不一致的情况
  2. 无论运营怎样修改,都不会造成对前端用户的影响,先前首页出现过运营修改商品缓存失效后出现繁忙页面的现象,但这次海选的优化可以避免这种现象但也有不好的地方:
  3. 1分钟要批量读一次DB,对DB也是有点压力的
  4. 这种方式在凌晨没人访问的时候是一种浪费,不知有没有些更绿色一点的同步机制?大家有什么建议呢?

  一些缺点:n  线上的监控要完善,如key的qps,value占的空间大小,最后有后台操作线上的KV,这样以后作为参考对一些请求次数很高的key进行优化(考虑放本地缓存等);。n  关于过期时间的操作比较不方便,ValueCommand中的multiSet接口没有过期时间参数,而单独set一个value时是有的,这点比较奇怪,而且其他的命令,在处理过期时间方面很多都要采用TedisManager来做。

  跳表算法:这次在使用redis时学习了一个新的平衡数据结构---跳表,实现快速的插入和查询。

其原理和实现的复杂度比红黑树平衡树之类的都要简单。参考博客如下:

  1. http://kenby.iteye.com/blog/1187303
  2. http://www.cxphp.com/?p=241
  3. 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

四、

五、

时间: 2024-10-16 02:32:13

Redis(li)的相关文章

深入学习Redis(3):主从复制

原文:深入学习Redis(3):主从复制 前言 在前面的两篇文章中,分别介绍了Redis的内存模型和Redis的持久化. 在Redis的持久化中曾提到,Redis高可用的方案包括持久化.主从复制(及读写分离).哨兵和集群.其中持久化侧重解决的是Redis数据的单机备份问题(从内存到硬盘的备份):而主从复制则侧重解决数据的多机热备.此外,主从复制还可以实现负载均衡和故障恢复. 这篇文章中,将详细介绍Redis主从复制的方方面面,包括:如何使用主从复制.主从复制的原理(重点是全量复制和部分复制.以及

redis(一) 安装以及基本数据类型操作

redis(一) 安装以及基本数据类型操作 redis安装和使用 redis安装 wget http://download.redis.io/redis-stable.tar.gz tar zxvf redis-stable.tar.gz cd redis-stable.tar.gz make make install redis启动 redis-server redis关闭 redis-cli shutdown 配置 方法一 redis-server /path/to/redis.conf r

redis(二)高级用法

redis(二)高级用法 事务 redis的事务是一组命令的集合.事务同命令一样都是redis的最小执行单元,一个事务中的命令要么执行要么都不执行. 首先需要multi命令来开始事务,用exec命令来执行事务. 127.0.0.1:6379> multi OK 127.0.0.1:6379> hset user:1 name xiaoming QUEUED 127.0.0.1:6379> hset user:1 name daxiong QUEUED 127.0.0.1:6379>

windows下安装redis(转)

add by zhj: redis相比memcached相比,性能上并没有绝对的优势.我们用redis的是因为它支持更多的数据类型,而且在分配给redis的内存用满了之后, redis也不会删除没有过期的数据,而是按一定的算法把一些数据写到磁盘,从而为redis开辟出内存空间存储新数据.而memcached则是按一定的算法直接 删除未过期数据.reddis也可当消息队列,但我还不清楚它与传统消息队列ActiveMQ RabbitMQ ZeroMQ等相比,哪个更有优势.回头好好研究一下. 原文:h

.Net使用Redis详解之ServiceStack.Redis(七)

原文:.Net使用Redis详解之ServiceStack.Redis(七) 序言 本篇从.Net如何接入Reis开始,直至.Net对Redis的各种操作,为了方便学习与做为文档的查看,我做一遍注释展现,其中会对list的阻塞功能和事务的运用做二个案例,进行记录学习. Redis官方推荐的.NET驱动类库为Service.Stack.Redis.然而网上对这个类库的中文文档不是很全面与合理,这篇文章主要就对这个类库做注释展现.不足遗漏之处还望见谅,海涵. .Net使用Redis是非常方便与快捷与

Redis(五)、Redis数据库集群相关

Redis数据库集群 第1章 集群简介 Redis 集群是一个分布式(distributed).容错(fault-tolerant)的 Redis 实现, 集群可以使用的功能是普通单机 Redis 所能使用的功能的一个子集(subset),是一个可以在多个 Redis 节点之间进行数据共享的设施(installation). Redis 集群中不存在中心(central)节点或者代理(proxy)节点, 集群的其中一个主要设计目标是达到线性可扩展性(linear scalability). Re

深入学习Redis(2):持久化

前言 在上一篇文章中,介绍了Redis的内存模型,从这篇文章开始,将依次介绍Redis高可用相关的知识--持久化.复制(及读写分离).哨兵.以及集群. 本文将先说明上述几种技术分别解决了Redis高可用的什么问题:然后详细介绍Redis的持久化技术,主要是RDB和AOF两种持久化方案:在介绍RDB和AOF方案时,不仅介绍其作用及操作方法,同时介绍持久化实现的一些原理细节及需要注意的问题.最后,介绍在实际使用中,持久化方案的选择,以及经常遇到的问题等. 原创不易,如果觉得文章对你有帮助,欢迎点赞.

Redis(八) LRU Cache

Redis(八)-- LRU Cache 在计算机中缓存可谓无所不在,无论还是应用还是操作系统中,为了性能都需要做缓存.然缓存必然与缓存算法息息相关,LRU就是其中之一.笔者在最先接触LRU是大学学习操作系统时的了解到的,至今已经非常模糊.在学习Redis时,又再次与其相遇,这里将这块内容好好梳理总结. LRU(Least Recently Used)是缓存算法家族的一员--最近最少使用算法,类似的算法还有FIFO(先进先出).LIFO(后进先出)等.因为缓存的选择一般都是用内存(RAM)或者计

学习Redis(二)

自关系型DB诞生40年来,从理论产生到现实产品(MySQL.Oracle),已在DB领域上升到了霸主地位,每年数百亿$的庞大产业市场: 随着web2.0的兴起,对于规模日益庞大的海量数据,传统的关系型DB显得力不从心,如超大规模和高并发的微博.微信.SNS(socail network site,socail network services)纯动态网站等,关系型DB面临很多难以克服的问题,有IO瓶颈.性能瓶颈都难以有效突破,于是出现了很多针对特定场景,以高性能和使用便利为目的的差异化的DB产品