Redis学习笔记4-脚本、持久化和集群
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数据库。
下面是一个简单的例程:
# -*- 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使用:
# -*- 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。
标签:pipe,Redis,redis,笔记,blog,result,key,time From: https://blog.51cto.com/u_6186189/6458286