一篇足以之redis学习
1.简介
开源、C语言编写,key-value数据库
2.优势
性能高:Redis的读写速度分别是110000次/秒 // 81000次/秒
原子性:redis的所有操作都是原子性的,因为redis是单线程
扩展:为什么redis不是多线程的?
redis 核心就是 如果我的数据全都在内存里,我单线程的去操作 就是效率最高的,为什么呢,因为多线程的本质就是 CPU 模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。redis 用 单个CPU 绑定一块内存的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的,所以它是单线程处理这个事。在内存的情况下,这个方案就是最佳方案 —— 阿里 沈询
丰富的特性,Redis支持publish/subscribe(发布/订阅)、通知、key过期等特性。
支持丰富的数据类型的数据存储:(String)、哈希(Map)、列表(list)、集合(sets)、有序集合(sorted sets)等类型
3.特点
3.1 支持数据的持久化,可以将内存中的数据保存到磁盘中,重启时可以再次加载使用
3.2 Redis支持数据库备份,也就是master-slave(主从)模式的数据备份。(从redis中只能进行读)
4.应用场景
会话缓存机制
消息队列
排行榜或者计数
发布订阅消息
5.基础语法
set key value
get key value
del key 返回值是删除的key的数量
keys * 查询所有的key
DUMP key 序列化键值
exists key 查看key存在不存在
expire key 过期时间[单位/秒] 给key设置过期时间,过期了就不再可用
persist key 移除过期时间
pttl key 查询过期时间
rename key newkey
type key 显示value的类型
6.不同数据类型的应用场景
1.String
key-value类型 value不仅可以是string也可以是数字
常用命令:set get incr decr mget
使用场景: 常规key-value缓存应用。常规计数: 微博数, 粉丝数。
2.Hash
常用命令: hget hset hgetall
Redis的Hash实际上是内部存储的value是一个hashmap
使用场景:存储部分变更数据,如用户信息等。
3.List
常用命令:lpush,rpush,lpop,rpop,lrange等。
list是链表,可以用作消息队列。
业务中可以用一个线程用push来保存数据,在用一个工作线程用pop操作来去list里面的数据。
redis还提供了操作list中某一段的api,可以直接查询、删除某一段的元素
使用场景:使用list可以构建队列系统,使用sorted set甚至可以构建有优先级的队列系统。
比如:将Redis用作日志收集器
实际上还是一个队列,多个端点将日志信息写入Redis,然后一个worker统一将所有日志写到磁盘。
4.set
常用命令:sadd,spop,smembers,sunion 等。
set的功能跟List差不多,都是列表,特别之处在于set具有自动排重的功能,并且set提供了判断了判断某个元素是否在set集合内的接口
5.Sorted Set
常用命令:zadd zrange zrem zcard
与set的区别在于 sorted可以提供一个参数(score)来为成员排序,而且是插入有序的
7.redis的持久化机制
两种:RDB(Redis DataBase)和AOF(Append Only File),配置在redis.conf文件中
RDB:将数据以快照的形式保存下来。
RDB持久化是指在指定时间间隔内将内存中的数据快照写入磁盘,保存在一个二进制文件中,默认的文件名dump.rdb
触发机制:save bgsave 自动化
1.save:
该命令会阻塞当前redis服务器,执行save期间,redis不能处理其他命令。执行完成后如果存在老的RDB文件,会被新的替代。
2.bgsave:
这个命令会让redis在后台异步进行快照处理,快照的同时还可以响应客户端请求。
具体操作是redis进程通过fock()操作创建子进程来进行RDB持久化,完成后自动结束子进程
3.自动触发:
自动触发是通过配置文件redis.conf来完成的。
AOF: redis会将每一个收到的写命令都通过write函数追加到文件中。
存在一个问题,就是文件会越来越大,为了压缩AOF文件,redis提供了一个命令bgrewhiteaof
将内存中的数据以命令的方式保存到临时文件中,同时会fork出一条新进程来将文件重写。
触发机制:
(1)每修改同步always:同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
(2)每秒同步everysec:异步操作,每秒记录 如果一秒内宕机,有数据丢失
(3)不同no:从不同步
RDB和AOF如何选择: