Redis粗粒度使用记录
Redis是啥?
-- Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。Redis帮助开发者对一台机器的内存进行操作
Redis安装(默认端口6379)
- yum安装
配置文件:redis-server /etc/redis.conf
yum install redis
- 源码包安装
配置文件:/src/redis-server redis.conf
wget http://download.redis.io/releases/redis-x.x.x.tar.gz
tar xzf redis-x.x.x.tar.gz
cd redis-x.x.x
make # 编译
Redis 特点:
a. 持久化
- RDB(快照):是 Redis 默认的持久化方案。在指定的时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中。即在指定目录下生成一个dump.rdb文件。Redis 重启会通过加载dump.rdb文件恢复数据。
优点:
1 适合大规模的数据恢复。
2 如果业务对数据完整性和一致性要求不高,RDB是很好的选择。
缺点:
1 数据的完整性和一致性不高,因为RDB可能在最后一次备份时宕机了。
2 备份时占用内存,因为Redis 在备份时会独立创建一个子进程,将数据写入到一个临时文件(此时内存中的数据是原来的两倍哦),最后再将临时文件替换之前的备份文件。
所以Redis 的持久化和数据的恢复要选择在夜深人静的时候执行是比较合理的。
- AOF(日志):Redis 默认不开启。它的出现是为了弥补RDB的不足(数据的不一致性),所以它采用日志的形式来记录每个写操作,并追加到文件中。Redis 重启的会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
优点:数据的完整性和一致性更高
缺点:因为AOF记录的内容多,文件会越来越大,数据恢复也会越来越慢。
b. 单进程、单线程
使用 I/O 多路复用技术,让单个线程高效的处理多个连接请求(减少了网络IO的时间消耗。属于非阻塞IO)
优点:
1、代码更清晰,处理逻辑更简单
2、不存在多进程或者多线程导致的切换而消耗CPU
3、不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
缺点:无法发挥多核CPU性能。但可以通过在单机开多个Redis实例来完善
c. 5大数据类型(注意:redis操作时,只支持第一层:list,dict,...不支持嵌套)
redis={
k1: '123', # 字符串
k2: [1,2,3,4,4,5,3,5], # 列表/数组
k3: {1,2,3,4}, # 集合
k4: {name: xxx, age: 12}, # 字典/hash
k5: {('aa', 11), ('bb', 22), ('cc', 33)} # 有序集合
}
1、Python中Redis五类数据类型操作注意事项
1.1、字典/Hash 操作(慎重使用hgetall,优先使用hscan_iter)
问题:如果redis的k4对应的字典中有1000w条数据,请打印所有数据
# 方法a:不可取,从redis取到数据后,服务器内存无法承受,会爆栈
result = conn.hgetall('k4')
print(result)
# 方法b:正确做法,每100条取一次,通过生成器返回
result = conn.hscan_iter('k4', count=100)
for item in result:
print(item)