设计

  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. Redis的info命令只是好用,配置以及占用的内存情况一清二楚的;我考虑创建可视化的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里面是保存各个token和user的映射关系,而不是专属于某一个元素;对于viewed就是局部的,他是专属于某个token的浏览记录,判断依据就是这个结构的name里面是否带有session,token等限定性名词;
    5. 如果配置为AOF,那么每次重启都会从AOF中重新加载数据;
    6. 代表关闭自动瘦身;
    7. Redis的权重一定要考虑时间维度,投票以及页面浏览量都设计了机制来进行新入老退的机制,就是在时间维度上面的考量,这一点不可不察;
    8. Redis还有Sort功能,可以对列表集合以及哈希进行排序;同时排序的时候还可以通过关联到Hash表来指定权重;
    9. 个元素;-1代表最大,0代表最小,删掉0~-101,意思明了;
  5. List并没有提供对于单个元素的获取,只有一个LIndex,也是基于元素获取索引;
    1. 设置AOF:config set appendonly yes; config set appendfsync everysec;这里有三个选项,always,过于频繁读写硬盘效率也低,对于硬盘伤害也大(尤其是固态硬盘);everysec,每秒钟同步一次,这是最推荐的方式;no,用操作系统决定;这个选项知道就可以了,因为让操作系统来决定,意味着等待缓冲区满了再搞,但是这样将会导致写操作缓慢(只有等待同步之后才能够空出缓冲区写入写操作);而且这个方式很不靠谱,一旦是丢失数据,数量不可估计;Redis里面提供了比较强大的纠错功能,set一个不合法的key将会报错;或者说,Redis的config命令只允许设置设定好存在的设置;不允许添加;
    2. Redis中,有序集合判断是否有某值,通过zscore的返回值是否为空进行判断。
    3. HSet和HMSet差别在于后者可以一次指定多个key-value;M意思为multi-
    4. setRange, 修改指定字符串指定起始位置之后的字符串;
    5. ,后者为0;
    6. Hash对象中,应用分片技术可以节省内存,是因为小元素Hash采用的是ziplist结构,节省空间;如果一堆元素一股脑全部保存,只能用比较占用空间的LinkedList结构;

Redis总录的更多相关文章

  1. Redis总导航目录

    NoSQL入门和概述 NoSQL入门概述 3V + 3高 当下的NoSQL经典应用 NoSQL数据模型简介 NoSQL数据库的四大分类 在分布式数据库中CAP原理CAP+BASE Redis入门介绍 ...

  2. PHP对redis操作详解【转】

    /*1.Connection*/ $redis = new Redis(); $redis->connect('127.0.0.1',6379,1);//短链接,本地host,端口为6379,超 ...

  3. 深入分析redis cluster 集群

    深入分析redis cluster 集群安装配置详解 下面小编来为各位介绍一篇深入分析redis cluster 集群安装配置详解,如果你希望做数据库集群就可以来看看此文章的哦. http://rub ...

  4. redis 基础学习总结

    背景:因为项目用到了redis,加上之前一直听说了redis,但一直没有用过,正好项目现在要用到了,抽时间简单学习了下,做个记录总结下. 一 .Redis简介 介绍Redis之前,先了解下NoSQL ...

  5. redis函数总结

    <?php /*1.Connection*/ $redis = new Redis(); $redis->connect('127.0.0.1',6379,1);//短链接,本地host, ...

  6. php Redis函数使用总结(string,hash,list, set , sort set )

    对于:string, set , sort set , hash 的增,改操作,是同一个命令,但是把它当改操作时,及时成功返回值依旧为0 对于:list结构来说,增删改查自有一套方法.   <? ...

  7. Java访问Redis

    Redis的数据类型总共有如下几种 1.String(字符串) 2.List(列表),字符串列表,有序 3.Hash(哈希),可以存储类似于数据库的表结构 4.Set(集合),无序,不可重复 5.ZS ...

  8. PHP对redis操作详解

    /*1.Connection*/$redis = new Redis();$redis->connect('127.0.0.1',6379,1);//短链接,本地host,端口为6379,超过1 ...

  9. php redis 的基本操作

    前言: 断断续续的接触了redis的使用.但是也就简单的记住了几个set.get方法,用的还是太少了吧.所以来做个笔记,记录下一些常用的命令. 内容: 首先是php连接redis. $redis = ...

随机推荐

  1. 从BAE到SAE,从SAE又回到BAE

    版权声明:本文为博主原创文章,未经博主允许不得转载. [很久以后] 这段话是很久之后补充的,发现错误要勇于改正,以下红色字体是对以前观点的改正, 大概总结下: 1.bae最大缺点是需要备案,不过现在看 ...

  2. oracle db mos文章 翻译系列

    http://blog.csdn.net/msdnchina/article/details/38377125

  3. 精灵类(CCSprite)

    一.对精灵的理解 玩家控制的主角.AI控制的NPC,以及地图上的宝箱.石块,甚至游戏主菜单的背景图片都是精灵.因此,可以这样认为,玩家看到的一切几乎都是由精灵构成的. 精灵不一定是静态的.通常,一个精 ...

  4. sudo 免密码

    转自:sudo 免密码 很多都是修改/etc/sudoers权限为740再加上一句 ALL=NOPASSWD:ALL 或者加一句 yourname ALL=(ALL) NOPASSWD: ALL 然后 ...

  5. 路径MTU

    数据在以太网中的传输有长度有一个限制,其最大值一般情况下是1500字节.链路层的这个特性叫作MTU,也就是最大传输单元.不同类型的网络会有所不同的.如果IP层有一个数据报要传输,而且数据的长度比链路层 ...

  6. 聊聊Android5.0中的水波纹效果

    水波纹效果已经不是什么稀罕的东西了,用过5.0新控件的小伙伴都知道这个效果,可是如果使用一个TextView或者Button或者其它普通控件的话,你是否知道如何给它设置水波纹效果呢?OK,我们今天就来 ...

  7. git对象存储

    之前提到当存储数据内容时,会在objects文件夹下存储一个git对象.我们花些时间来看看 Git 是如何存储对象的.你将看来如何通过 Ruby 脚本语言存储一个 blob 对象 ,有必要了解一下对象 ...

  8. ThinkPHP函数详解:cache方法

    cache方法是3.0版本开始新增的缓存管理方法.注意:3.1.2版本后因cache方法并入原S方法,所以cache方法不再建议使用,用S方法即可. cache 用于缓存设置.获取.删除操作 用法ca ...

  9. mysql数据库文件默认保存目录(windows)

    如果没有自己去设置安装路径,MYSQL默认安装在C:/Program Files/MySQL/MySQL Server 5.1,新建的数据库文件在C:/Documents and Settings/A ...

  10. mac最常用终端命令

    1分钟,快速复习下: pwd (显示当前所在路径) ls -l  (列出文件的详细信息,如创建者,创建时间,文件的读写权限列表等等) touch `filename`(创建文件) open `file ...