什么是Redis
官方文档
Redis(Remote Dictionary Server) Redis 是一个开源的使用 ANSIC 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API 的非关系型数据库。
传统数据库遵循 ACID 规则。而 Nosql(Not Only SQL 的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称) 一般为分布式而分布式一般遵循 CAP 定理。
存储位置:内存
内存和硬盘的区别:内存:存储速度快,断电数据消失
磁盘:存储速度慢,持久化存储
使用场景:
Redis的数据key-value类型,存储在内存中的,因此Redis的读写速度快,每秒可以处理超过十万次的读写操作所以常应用于数据量非常的大,查询频率高的情况。
1.app首页流量高峰,大型秒杀活动,高速的读写活动以及大量的数据会将MySQL压垮
2.不需要持久化存储的操作,短信验证码,登录验证码,点赞数(点赞取消动作频繁,且高并发场景)
3.分布式锁
4.分布式缓存
数据结构:key-value键值对方式存储
key:string类型
value:string,hash,list,set,zset
以及两种特殊的数据类型:Geospatial,BloomFilter(布隆过滤器)
String(最常用)
incr指令通常用于点赞操作,A,B在刷视频时,在刷到同一个视频时,该视频的点赞数为200,AB同时点赞各自自增为201,最终新值总为202,这就是原子自增性。
常见指令
set name zhencong --存放字符串键值对
mset name zhencong age 18 --批量存放键值对
SETNX name zhencong --如果不存在key为name,那么就设置value(分布式锁的原理)
get name -- 获取key
mget name age --批量获取key
DEL key -- 删除key
expire key 60 --设置过期时间,单位为秒
INCR key -- 将key中存储的数字加1
DECR key -- 将key中存储的数字减1
INCRBY key 2 --将key中存储的值都加上2
DECRBY key 2 --将key中存储的值都减去2
set name 张三 age 18 sex 男
在部分场景中,可以当做存储对象来使用
使用场景
小视频文章等点赞,浏览量
HASH(哈希)
常见指令
hset hash name zhencong --设置值,
hget hash name -- 获取值
hmset hash name zhencong age 18 --批量设置
hmget hash name age --批量获取
hgetall hash 获取key的所有值
hkeys hash 获取hashmap中所有的key
hvals hash 获取hashmap中所有的value
使用场景
存储部分数据的更改,用户操作时暂存用户数据信息
List(列表)
常见指令
rpush myList valule1 --向 list 的右侧(list的尾部)添加元素
rpush myList value2 value3 --向list的右侧(list的尾部)添加多个元素
lpush myList valule1 --向 list 的头部(左侧)添加元素
lpush myList value2 value3 --向list的头部添加多个元素
lpop myList # 将 list的尾部(最左边)元素取出
rpop myList2 value1 --尾插
特殊使用
lpush+lpop=Stack(栈) //rpush+rpop
lpush+rpop=Queue(队列)
lpsh+ltrim=Capped Collection(有限集合)
lpush+brpop=Message Queue(消息队列)
使用场景
更新日志等,与此同时搭配LTRIM保存最新的n条日志。list的使用较为特殊,不同组合搭配使用成为栈,队列等数据结构
Set(集合)
当你需要存储一个没有重复数据的列表时就可以选择set,同时set也可以判断某个数据在不在集合里面。(和list的对比:无序,去重)
使用场景
好友列表
Zset(有序集合)
有序的字符串集合,无重复数据(有序,去重)
使用场景:排行榜。
Geospatial
使用场景:比如美团的地图部分使用,可以表示二维坐标,支持范围查询和距离查询
BloomFilter
使用场景:海量数据的查找,但是概率不是百分百
在该数据结构中,存储的是hash值,所以使得占用空间小,但是对于不同对象,hash值存在相同的可能,这也是不能达到百分百的原因。
这也是为什么重写hashcode和重写equals必须搭配的原因
正常情况下,对比hash值后会对比二者的属性,因为hash值存在相等的可能性,如果只是单纯的对比hash,那么判断两个对象相等就会出错。
和mysql的区别
相对于Redis来说,MySQL数据存储在磁盘中,读写速度慢,对于较大数据量以及高并发场景,很容易压垮MySQL,与此同时MySQL索引文件采用的是b+树,查询时间为O(logn),Redis底层结构采用的是k-v形式,时间复杂度仅为O(1),在部分业务场景中,可以采用Redis作为缓存。