Redis浅显的使用

来源:互联网 发布:表情制作软件 编辑:程序博客网 时间:2024/05/18 10:43


Redis,在好多项目场景中帮助我们。


老生常谈,Redis与memcache的区别


1. Redis中,并不是所有的数据都一直存储在内存中的,这是相比memcache的最大区别之一。

2. Redis不仅仅支持简单的k/v类型的数据,还提供list、set、hash等数据结构的存储。相比而言更具数据库特征。

3. Redis支持数据的备份,即master-slave模式的数据备份。

4. Redis支持数据的持久化,可将内存中的数据保持在磁盘中,重启的时候可以再次加重重新使用。

5. 过期策略 memcache在set时指定,redis可通过expire指定 

6. Memcache可以缓存图片、视频等。

7. Redis只使用单核,memcache可使用多核。存小数据redis性能更高,100k以上数据memcache性能更高。无论选哪个,qps都不会成为瓶颈。


Redis 安装 + Sentinel配置主从

[root@bx_2_35 ~]# cd /opt/soft/
[root@bx_2_35 soft]# wget http://download.redis.io/releases/redis-2.8.13.tar.gz
[root@bx_2_35 soft]# tar -xzf redis-2.8.13.tar.gz
[root@bx_2_35 soft]# tar -xzf redis-2.8.13.tar.gz 
[root@bx_2_35 soft]# cd redis-2.8.13
[root@bx_2_35 redis-2.8.13]# make


[root@bx_2_35 redis-2.8.13]# cd src
[root@bx_2_35 src]# cp -pf redis-server /usr/local/bin
[root@bx_2_35 src]# cp -pf redis-cli /usr/local/bin
[root@bx_2_35 src]# cp -pf redis-sentinel /usr/local/bin

[root@bx_2_35 src]# cd ..
[root@bx_2_35 redis-2.8.13]# vim redis.conf 


[root@bx_2_35 redis-2.8.13]# redis-server 


关闭XShell会话(或者指定配置文件 redis-server redis.conf 就不需要关闭会话了)
重新打开会话
[root@bx_2_35 ~]# redis-cli 



持久化相关的配置在 redis.conf中
快照的方式持久化到磁盘
自动持久化规则配置
save 900 1
save 300 10
save 60 10000
Append-only file 的方式持久化 
每次执行写操作命令之后,都会将数据写到server.aofbuf中。
# appendfsync always
appendfsync everysec
# appendfsync no



重启 redis


关闭会话(或者指定配置文件就不需要关闭会话了)

设置主从 ( 2.35主, 5.23从)
[root@bx_2_35 ~]# pkill redis-server

[@bx_5_23 /]# cd /opt/soft/redis-2.8.13/
[@bx_5_23 redis-2.8.13]# vim redis.conf 

[root@bx_2_35 redis-2.8.13]# redis-server redis.conf 
[@bx_5_23 redis-2.8.13]# redis-server redis.conf






[root@bx_2_35 redis-2.8.13]# vim sentinel.conf 
sentinel monitor mymaster 10.16.2.35 6379 1
[root@bx_2_35 redis-2.8.13]# redis-sentinel sentinel.conf --sentinel &


Redis消息队列

Redis除了可以当做Key-Value型的NoSql数据库外,同时由于它支持List数据结构,完全可以实现轻量级的消息服务。

个人在项目中使用的几个简单应用场景是: 

1. 将新增加的奖品不时lpush到奖品队列中,用户符合中奖规则,rpop出来该奖品。简单的生产者消费者队列。

2. 用户播放历史记录。

生产者:

播放影片,前端Http轮询上报当前用户(user)、影片(film)、播放时长(time)。放入生产者队列。由于用户量较多,分配了5个队列。按照user hashcode除以5取余,分配该记录到指定的队列中。按user哈希的好处是同一个用户的不同记录肯定会落到唯一特定的队列中。若落入不同的队列,可能两个队列处理不是按上传的先后顺序,先上传的可能会把后上传的覆盖掉。

String key = "film-history-q-" + (user.hashCode() % 5);Long beforeLen = redisUtils.lLen(key);    if (beforeLen < 50000) {      StringBuffer sb = new StringBuffer(user);      sb.append("|").append(film).append("|").append(video).append("|").append(time);      Long afterLen = redisUtils.lPush(key, sb.toString());      if (afterLen > 0) {        return true;      }    }


此处限制beforeLen < 50000是为了防止生产者队列无限增大。超过这个限定,我们认为很可能消费者挂掉了。另外未考虑更高的伸缩性: 如果5个队列也不够用,业务要求严格的话要考虑一致性哈希了。

消费者:

构建5个消费者Worker,分别 对5个队列进行消费,调用上报播放记录接口。期间我们可以做一些合并相同用户同一影片播放记录的策略,减少上报播放记录接口次数。



最后推荐一篇还不错的文章 http://www.cnblogs.com/si812cn/p/4042992.html

以及Redis命令参考 http://redisdoc.com/

0 0