作用
- 内存存储,持久化,内存中是断电即失,持久化很重要(rdb,aof)
- 效率高,高速缓存
- 发布订阅系统
- 地图信息分析
- 计时器,计数器
……
特点
- 开源
- 持久化
- 多种数据类型
基础知识
redis中有16个数据库,默认使用第一个数据库
select 数字 :可切换到第几个数据库
keys * :查看当前数据库下所有的key
flushdb:清除当前数据库
flushall:清除所有数据库
dbsize:查看数据库大小
redis是单线程的
redis基于内存操作,所以 cpu不是redis的性能瓶颈,redis的瓶颈是网络带宽和内存,可以使用单线程来实现
为什么redis单线程还这么快
- 高性能的服务器不一定是多线程的
- 多线程不一定比单线程效率高
速度:cpu>内存>硬盘
redis将所有数据放在内存中,所以使用单线程效率最高,多线程会有cpu中的上下文切换,这是耗时操作
而对于内存系统来讲,没有上下文切换效率就是最高的,多次读写都是在一个cpu上
五大数据类型
String(字符串)
String类使用场景
value除了是字符串还可以是数字
- 计数器
- 粉丝数
- 统计多单位数量
- 对象缓存存储
List(列表)
- 实际上是个链表,before node ,after ,left ,right 都可以插入值
- 如果移除了所有值,空链表,代表不存在
- 两边插入或改动值,效率比较高
- 如果key不存在,创建新的链表,存在,新增内容
作栈(lpush lpop) 作消息队列(lpush rpop)
Set(集合)
Hash(哈希)
Map集合,本质和String差不多,都为键值对,不过他的值为map集合
hash更适合用于对象的存储,String用于字符串的存储
Zset(有序集合)
三种特殊数据类型
geospatial(地理位置)
底层原理:
就是Zset,所以可以用Zset来操作geo(如移除元素,查看所有元素)
- 朋友定位
- 附近的人
- 打车距离
HyperLogLog(基数统计)
是redis的数据结构
可用于统计数据中去重之后的元素个数
如果数据较多,可能会有误差
如果容错,推荐使用
Bitmap(位存储)
位图,也是radis的数据结构
事务
- 本质:一组命令的集合,在事务中的所有命令将会串行化的执行,Redis在此期间不会对其他客户端的请求提供任何服务
- 事务在执行一次后就已经没了,如果需要重新执行,需再次开启
- 在Redis事务执行过程中,如果有一条命令执行失败,剩下命令依然会执行
总结:redis事务就是一次性,顺序性,排他性的执行一个队列中的一系列命令
1、Redis事务没有隔离级别概念
批量操作在发送exec命令前被放入队列缓存中,并不会被实际执行,也就不存在事务内的查询能看到更新,事务外的查询不能看到
2、Redis不保证原子性
原子性(要么同时成功,要么同时失败)
Redis中单条命令的执行是保证原子性的,而事务是不保证的,且没有回滚,事务中任意命令执行失败,其余命令仍会被执行
3、三个阶段
- 开启事务
- 命令入队
- 执行事务
4、相关命令
multi 开启事务
exec 提交事务
discard 取消事务
watch 开启监控
unwatch 取消监控
若命令中存在语法错误(类似Java中的1/0,运行时异常),执行exec时,错误命令抛出异常,其它命令正常执行
若命令中存在(编译时异常)则exec命令时,所有命令都不会执行