设计
- 选择合适的数据对象来存储对象:String,List,Hash(Entity角色对象),Set,Zset(需要排序);
- 选择存储是全局的,还是局部的;
机制
- 批处理(pipeline)
- 事务(watch-mulit-execut)
- 锁(setNx)
保存
- Save/BGSave;占用内存不是很大(10G)
- AOF(10G以上);
- 复制;
细节
- Redis事务,Redis是单线程不假,但是命令是一条一条发过来的,所以如果是事务类操作,还是可能在两条命令之间被加塞,于是需要使用事务来控制,multi指令发送给客户端之后,redis服务端将会缓存该客户端的指令,直到exec接收到之后才会批量执行这些指令,执行完毕后,才会处理其他的客户端请求;
- Redis的info命令只是好用,配置以及占用的内存情况一清二楚的;我考虑创建可视化的Redis工具,不过估计网上应该已经有了;在从服务器端可以通过Info下面的master_link_status来判断从同步是否完成;再通过aof_pending_bio_fsync来判断数据是否已经写回到了硬盘中;如果有需要的话;
- 可以通过expire指定键值的过期时间,还可以通过persist来移除过期时间设定;
- redis集群是读写分离机制,主服务器写入信息,同步到各个从服务器中;只需要配置从服务器的配置文件slaveof节点,指明主服务器的ip以及端口即可;这样,服务器重启后将会主动和主服务器进行关联;无论主从保存方式rdb还是aof都可以;水平扩展Redis集群非常方便;对于大量Redis集群,一个主服务器可能会压力比较大,可以将从服务器当做为master(但是仍然不能写),组成集群树;
- 但是这也有一个问题:Redis只能是做到集群,这种集群和Memcache的一致性算法一样,前者是写压力集中在一台机器上面,读压力分散到了各个服务器,后者则是可以把写压力分散;Redis的主从复制既有负载均衡的意味,同时还有集群的味道;Memcache是纯粹的集群;
- 如果单台机器部署多个Redis,各自都是不同的端口,这个时候启动redis-cli需要指定-p参数,指定端口,如果想要连接到别的机器,需要指定-h参数;可以通过redis -h看到各个参数情况;
-
更换Redis服务器,可以新建一个服务器作为新的主服务器,然后把slavor都指向新的服务器,可以把一台从服务器提升为主服务器;我的想法是前者比较好,改动量小,外界调用还是内部同步,前提是通过域名关联,只要把域名指向新的服务器即可;这个还需呀好好想想;还有开发角度,对于获取读/写Redis需要一套控制流程等,如何设计比
- Redis中退出需要进入到客户端,执行shutdown命令;也可以通过redis-client -p 6379 shutdown进行关闭
- Redis启动如果直接使用redis-server需要指定一下config路径:./redis-server redis.conf(如果config就在同步目录下);否则Redis将会加载默认的配置文件;这个也是我在配置文件中配置了AOF半天,但是不好使的原因;
- 配置文件生效需要重启Redis
- Redis结构的本质是考虑数据结构的范围是全局的,还是局部的,比如login就是全局的,本身这个hash里面是保存各个token和user的映射关系,而不是专属于某一个元素;对于viewed就是局部的,他是专属于某个token的浏览记录,判断依据就是这个结构的name里面是否带有session,token等限定性名词;
- 如果配置为AOF,那么每次重启都会从AOF中重新加载数据;
- 代表关闭自动瘦身;
- Redis的权重一定要考虑时间维度,投票以及页面浏览量都设计了机制来进行新入老退的机制,就是在时间维度上面的考量,这一点不可不察;
- Redis还有Sort功能,可以对列表集合以及哈希进行排序;同时排序的时候还可以通过关联到Hash表来指定权重;
- 个元素;-1代表最大,0代表最小,删掉0~-101,意思明了;
-
List并没有提供对于单个元素的获取,只有一个LIndex,也是基于元素获取索引;
- 设置AOF:config set appendonly yes; config set appendfsync everysec;这里有三个选项,always,过于频繁读写硬盘效率也低,对于硬盘伤害也大(尤其是固态硬盘);everysec,每秒钟同步一次,这是最推荐的方式;no,用操作系统决定;这个选项知道就可以了,因为让操作系统来决定,意味着等待缓冲区满了再搞,但是这样将会导致写操作缓慢(只有等待同步之后才能够空出缓冲区写入写操作);而且这个方式很不靠谱,一旦是丢失数据,数量不可估计;Redis里面提供了比较强大的纠错功能,set一个不合法的key将会报错;或者说,Redis的config命令只允许设置设定好存在的设置;不允许添加;
- Redis中,有序集合判断是否有某值,通过zscore的返回值是否为空进行判断。
- HSet和HMSet差别在于后者可以一次指定多个key-value;M意思为multi-
- setRange, 修改指定字符串指定起始位置之后的字符串;
- ,后者为0;
- Hash对象中,应用分片技术可以节省内存,是因为小元素Hash采用的是ziplist结构,节省空间;如果一堆元素一股脑全部保存,只能用比较占用空间的LinkedList结构;