Redis总录

设计

  1. 选择合适的数据对象来存储对象:String,List,Hash(Entity角色对象),Set,Zset(需要排序);
  2. 选择存储是全局的,还是局部的;

机制

  1. 批处理(pipeline)
  2. 事务(watch-mulit-execut)
  3. 锁(setNx)

保存    

  1. Save/BGSave;占用内存不是很大(10G)
  2. AOF(10G以上);
  3. 复制;

细节

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