==========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重启并同步后即可提供服务。