现在的位置: 首页 > 综合 > 正文

redis 学习笔记

2018年02月11日 ⁄ 综合 ⁄ 共 2133字 ⁄ 字号 评论关闭

==========redis  
1. 什么是redis ?
  redis 是一种 key  value store , 这个可以替代 mysql 
  redis是一种 memcache ,  这个可以用来解决高并发请求 
  是一种带有本地持续化方案的 memcache  ,  
  不仅可以保存 key value , 还可以保存有结构的数据 , 如  string  hash  链表 集合set  有序的集合  
  redis是一个内存数据库, 高性能是依赖内存使用的。  简单理解,数据尽可能的往内存里装。 

2. redis有哪些独特的地方 ?
  代码精简  1万行, 简单就是最好的。
  代码依赖小, 不依赖第三方库文件
  使用epoll 事件多路分离,效率高, 高并发 ,相对 select方案不受 1024句柄限制 
  主线程单线程跑, 不存在临界资源的 互斥访问  
  支持事务处理 

3. 啥时候用redis ? 
  高并发
  大量的查询排序 

4. 咋个用 redis  ? 
  读写string 类型 如
    set user:123:nickname  abel       这个命令就将用户id为123用户的 nickname 设置为  abel , key是 user:123:nickname  value是 abel 
    get user:123:nickname             读出key 为  user:123:nickname 的 数据 
    这种方式 尽量少用, 因为一个 key-value 要使用512个字节内存, 浪费了, 可以使用  hash的 hset  hget , 用一个key 保存多个 value 如下
  hash方式读写 string 类型 
    hset user:123  nickname "abel"
    hset user:123  email  "wangdong@mycolorway.com"
    hget user:123  email      这个就读出来了      hash的方式一个key 可以对应数据表中的一条纪录,
  链表读写 
    补充一下 : 任何数据结构都要考虑内存中如何存储。 顺序存储还是链表存储。 
               顺序存储 优点是可以直接通过下标就可以访问到数据,比如 数组 a[10] , 缺点是插入数据要移动已经存在数据的内存位置。
               链式存储 缺点是读取时,要先定位, 优点是插入时不需要移动老数据位置 
    redis 的链表采用的链式存储 , 写入时极快, 索引访问就没有那么快了 
    如 :  
    lpush message:123:last.comment  "hi abel"    
    lpush message:123:last.comment  "I miss you"    在链表头添加 最新的 评论  
    lrang message:123:last.commnet 0 9      取出最新的 message主题id为123的 最新的 10条评论。   
  集合的读写 (集合中的元素是没有顺序的 )
    sadd message:123:reader 1
    sadd message:123:reader 2       这个将阅读人的id信息纪录到 集合中 
    sismember message:123:reader 3    这个返回0 或1 标示 3是否阅读过这个 message  
    smembers message:123:reader     这个返回 1 2 
  有序集合, 作用与mysql索引等同,      
    zadd topic:top 100 "ka nong"     100 是对应的权重分数 
    zadd topic:top 200 "music"
    zadd topic:top 80  "music"     更新操作,  因为是链式存储,  时间复杂度为 O(log N)  在N很大的情况下也是很快的。  
    zrange topic:top 0 -1          顺序输出所有
    zrevrange topic:top 0 -1       反顺序输出  

5. redis 能完全替换 mysql 吗 ?
  不能。 
  redis 重点是高性能, 在高可靠方面不如 关系型数据库 。 
  redis周期性将内存中的数据写入磁盘, 如果掉电会导致数据丢失。
  如果redis采用先写日志在写入内存, 掉电后通过日志重写,这可以增加可靠性, 但高并发的情况下,写日志的多余操作会拖累高性能。 
  所以,尘归尘,土归土。  关系db去解决高可靠,redis去解决高性能。 

6. 需要注意 ? 
  尽量少用  set get , 而使用 hashset 
  尽量不用将操作命令写入日志文件

  key 不要太长, 要消耗内存, 建议使用 type:id:field  ,比如  user:123:nickname  

7. 同步问题 ? 
  redis完全取代关系DB,个人感觉这个还是太超前,
  系统的可靠性会是其中的一个顾虑,另外如果没有一个内存超大的牛B的服务器 redis的优势也无法体现出来。 
  而更多见的场景是,新上线系统,初期都是中规中矩的, 随着并发量的上升,才会想办法解决性能问题。
  新增加redis系统,可以承担cache 和索引的工作。也就说 以关系DB为主,redis为辅的模式。 
  双存储的系统结构还需要考虑同步问题,可以每日凌晨自动(手动)从主DB 同步到 redis中。 
  应用系统在写入主DB时,同时更新redis。
  即使在 redis系统宕机的情况下,应用系统也不受印象。 redis重启并同步后即可提供服务。 

抱歉!评论已关闭.