redis常用知识汇总( 五 )


Redis如何做内存优化?
可以好好利用Hash,list,sorted set,set等集合类型数据 , 因为通常情况下很多小的Key-Value可以用更紧凑的方式存放到一起 。尽可能使用散列表(hashes) , 散列表(是说散列表里面存储的数少)使用的内存非常小 , 所以你应该尽可能的将你的数据模型抽象到一个散列表里面 。比如你的web系统中有一个用户对象 , 不要为这个用户的名称 , 姓氏 , 邮箱 , 密码设置单独的key , 而是应该把这个用户的所有信息存储到一张散列表里面
 
线程模型
Redis线程模型
Redis基于Reactor模式开发了网络事件处理器 , 这个处理器被称为文件事件处理器(file event handler) 。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器 。因为文件事件分派器队列的消费是单线程的 , 所以Redis才叫单线程模型 。
文件事件处理器使用 I/O 多路复用(multiplexing)程序来同时监听多个套接字 ,  并根据套接字目前执行的任务来为套接字关联不同的事件处理器 。
当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时 ,  与操作相对应的文件事件就会产生 ,  这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件 。
虽然文件事件处理器以单线程方式运行 ,  但通过使用 I/O 多路复用程序来监听多个套接字 ,  文件事件处理器既实现了高性能的网络通信模型 ,  又可以很好地与 redis 服务器中其他同样以单线程方式运行的模块进行对接 ,  这保持了 Redis 内部单线程设计的简单性 。
参考:
https://www.cnblogs.com/barrywxx/p/8570821.html
 
事务
什么是事务?
事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行 。事务在执行的过程中 , 不会被其他客户端发送来的命令请求所打断 。
事务是一个原子操作:事务中的命令要么全部被执行 , 要么全部都不执行 。
Redis事务的概念
Redis 事务的本质是通过MULTI、EXEC、WATCH等一组命令的集合 。事务支持一次执行多个命令 , 一个事务中所有命令都会被序列化 。在事务执行过程 , 会按照顺序串行化执行队列中的命令 , 其他客户端提交的命令请求不会插入到事务执行命令序列中 。
总结说:redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令 。
Redis事务的三个阶段
事务开始 MULTI
命令入队
事务执行 EXEC
事务执行过程中 , 如果服务端收到有EXEC、DISCARD、WATCH、MULTI之外的请求 , 将会把请求放入队列中排队
Redis事务相关命令
Redis事务功能是通过MULTI、EXEC、DISCARD和WATCH 四个原语实现的
Redis会将一个事务中的所有命令序列化 , 然后按顺序执行 。
1、redis 不支持回滚 , “Redis 在事务失败时不进行回滚 , 而是继续执行余下的命令” ,  所以 Redis 的内部可以保持简单且快速 。
2、如果在一个事务中的命令出现错误 , 那么所有的命令都不会执行;
3、如果在一个事务中出现运行错误 , 那么正确的命令会被执行 。
WATCH 命令是一个乐观锁 , 可以为 Redis 事务提供 check-and-set (CAS)行为 。可以监控一个或多个键 , 一旦其中有一个键被修改(或删除) , 之后的事务就不会执行 , 监控一直持续到EXEC命令 。
MULTI命令用于开启一个事务 , 它总是返回OK 。MULTI执行之后 , 客户端可以继续向服务器发送任意多条命令 , 这些命令不会立即被执行 , 而是被放到一个队列中 , 当EXEC命令被调用时 , 所有队列中的命令才会被执行 。
EXEC:执行所有事务块内的命令 。返回事务块内所有命令的返回值 , 按命令执行的先后顺序排列 。当操作被打断时 , 返回空值 nil。
通过调用DISCARD , 客户端可以清空事务队列 , 并放弃执行事务 ,  并且客户端会从事务状态中退出 。
UNWATCH命令可以取消watch对所有key的监控 。
 
事务管理(ACID)概述
原子性(Atomicity)


推荐阅读