Redis学习笔记1-基础命令及数据结构: http://blog.guoyb.com/2016/07/21/learn-redis-basic-commands/
Redis学习笔记2-事务与过期时间: http://blog.guoyb.com/2016/08/23/learn-redis-adv/
Redis学习笔记3-排序与消息通知: http://blog.guoyb.com/2016/08/24/learn-redis-adv-2/
学习笔记的第四部分记录Redis的脚本功能、持久化和集群。
脚本
在Python中使用redis-py来操作redis数据库。
下面是一个简单的例程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # -*- coding: utf-8 -*- import redis r = redis.StrictRedis(host='127.0.0.1', port=6379, db=0) r.set('foo', 'bar') print r.get('foo') r.hmset('dict', {'name': 'Bob'}) people = r.hgetall('dict') print people pipe = r.pipeline() pipe.set('foo', 'bar') pipe.get('foo') result = pipe.execute() print result |
一个较为复杂的例子如下,配合web.py使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | # -*- coding: utf-8 -*- import web import time import redis r = redis.StrictRedis() urls = ( '/', 'visit', '/online', 'online' ) app = web.application(urls, globals()) def time_to_key(current_time): return 'active.users:' + time.strftime('%M', time.localtime(current_time)) def keys_in_last_10_minutes(): now = time.time() result = [] for i in range(10): result.append(time_to_key(now - i * 60)) return result class visit: def GET(self): user_id = web.ctx.env['HTTP_USER_AGENT'] current_key = time_to_key(time.time()) pipe = r.pipeline() pipe.sadd(current_key, user_id) pipe.expire(current_key, 10 * 60) pipe.execute() return 'User:\t' + user_id + '\r\nKey:\t' + current_key class online: def GET(self): online_users = r.sunion(keys_in_last_10_minutes()) result = '' for user in online_users: result += 'User agent:' + user + '\r\n' return result if __name__ == "__main__": app.run() |
这个例子用redis缓存当前在线用户信息,用户无操作10分钟后切换到下线状态。
持久化
Redis支持两种持久化方式:
- RDB方式:采用数据快照,进行压缩,通过子进程进行后台持久化。利用写时复制(COW)进行优化,同时支持无硬盘方式(直接发送给网络传输)。
- AOF方式:记录一系列的Redis命令。支持定时重写AOF,从而去除冗余命令。
集群
- 支持一主多从的结构,适用于写入少(只从主数据库写入),读取多(可以从多个从数据库同步读取)的读写分离场景。
- 主从数据库之间会自动同步数据(从主到从)。
- 数据持久化可以放在从数据库做,从而降低主数据库负载。
- 引入哨兵机智,监控主从数据库运行情况,实现自动重启,主从切换。多个哨兵之间还可以互相监控。
- 支持分片,使用redis-trib.rb自动增加节点(可做重新映射,并自动迁移数据)。和mongo不同,redis集群是纯分布式的,并没有一个总控的路由进程mongos。
转载请注明出处: http://blog.guoyb.com/2016/09/09/learn-redis-other/