Redis的使用(结合自己的项目)
Redis是非关系型数据库,和Memcached类似,其存储格式为Key-Value格式,因为其存储于内存中,所以读写效率非常高,适用于大量数据的操作,降低数据库的io,并且支持持久化。而且拥有分布式架构,可做Session共享。
基础:Redis的默认端口号是6379,有16个数据库,下标从0开始,Redis是单线程+io多路复用,Memcached是多线程+锁。
Redis是支持事务的,而事务有四大特性:原子性,一致性,隔离性和永久性。
原子性:要么完成要么不完成,比如转账操作,要么成功要么不成功,
一致性:比如转账,转账前后两个账户的钱总数不变即为事务一致性
隔离性:每个事务的操作是互相隔离的,互不影响,比如张三和李四的转账是互不影响的
永久性:事务的操作是不可逆的,一旦转账,无法逆向操作
命令:
keys * 查看当前库所有的键
exists <key> 判断是否存在key
del <key> 删除某个键
expire <key> <second> 设置键过期时间 单位是s秒
ttl <key> 查看还有多少秒过期 -1表示用不过期 -2表示已经过期
move <key> <db> 把键移到另一个库下
dbsize 查看数据库key的数量
flushdb 清空当前的库
flushall 通杀所有库
Redis有五种数据类型:String,List,Hash,set,Zset
String:
String是二进制安全的,他可以包含任意数据源,最大512M
可以单个键值对进行设置,也可以批量操作,获取键对应值得长度,基本命令不再赘述。
项目中:
一:在省钱快报中,我使用Django框架来用Redis设置缓存,String数据类型来缓存用户的cookie,token等。(cookie和session是一起使用的,分别基于客户端和服务器,而手机端并不是html作为前端,所以引入了token)
二:在省钱快报中,后台需要统计商品被用户浏览的次数,用来进行数据分析,而这如果用mysql来实现的话,效率会非常低,因为io操作频繁,而且行级锁会争用,用而Redis的String的incr来实现则大大提高了效率。如set("visit:Phone:totals", 34600),电话总浏览量是34600次,从关系型数据库查出来的。每当有一个页面点击,则使用INCR增加点击数即可。incr("visit:Phone:totals"),可以在页面载入的时候直接获取这个值get("visit:Phone:totals")
List:链表
List是单键多值的,简单的字符串列表,从左或者从右插入。
底层是双向链表,对两端的操作性能很高,通过下标查询性能很低。
可以从左或者从右插入或者取出值,也可以用index按照索引来操作等等,基本命令不再赘述。
项目中:用在Celery的broker环节,(Celery的broker默认是RabbitMQ),List用作消息队列来实现异步,在省钱快报中,我用于服务器发送邮件和短信(用户的验证激活等等)的异步处理。
Hash:哈希
Redis中的Hashes类型可以看成具有String Key和String Value的map容器,可以给key集合中的file来赋值value,也可以批量进行操作。
项目中:在省钱快报中,我用Hash来存储用户的购物车数据,例如:用户张三设置为key,他购物车中的商品和数量来分别设置成field和value。
set和zset:集合与有序集合
set(集合)类似list的无序集合,保证列表中不会有重复数据,它的底层是一个value为null的hash表
zset(有序集合)与set集合非常相似,每个成员都关联了score,可以用来排序。
项目中:因为zset本身就是有序集合,关联了score,在项目中用来给各种数据排序(比如商品销量),默认就是从大到小。
Redis的持久化:两种方式:rdb(redis database)和aof(append of file)
rdb:redis单独创建(fork)一个进程来持久化,会先将数据写入临时文件中,待上次持久化结束后,会将该临时文件替换上次持久化文件。比aof效率高,但是最后一次操作数据可能会丢失,比如宕机时
aof:以日志形式记录每个写操作,启动时通过日志恢复操作。备份机制更加稳健
可读的日志文件,通过aof恢复更加稳健,可以处理失误,但是效率会低,因为每次都会同步日志,有性能压力。
Redis主从复制:
主从复制就是主机数据更新后根据配置和策略,自动同步到备份机的master/slaver机制,master写为主,slave读为主
用处:1。读写分离,性能拓展。2.容灾快速恢复
Redis的集群
集群是一个可以在多个Redis节点之间进行数据共享的设施。
Redis集群不支持那些需要同时处理多个键的Redis命令, 因为执行这些命令需要在多个Redis节点之间移动数据, 并且在高负载的情况下, 这些命令将降低Redis集群的性能, 并导致不可预测的行为。
Redis集群通过分区partition来提供一定程度的可用性availability: 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。
Redis集群提供了以下两个好处:
将数据自动切分split到多个节点的能力。
当集群中的一部分节点失效或者无法进行通讯时, 仍然可以继续处理命令请求的能力,详细配置参考https://blog.csdn.net/truelove12358/article/details/79612954