https://www.bilibili.com/video/BV1S54y1R7SB?p=36&spm_id_from=pageDriver
官方中文文档
http://www.redis.cn/commands.html
步骤
nosql数据模型
nosql四大分类
CAP
BASE
Redis
入门
安装
五大基本数据类型
String,List,Set,Hash,Zset
三种特殊数据类型
geo,hyperloglog,bitmap
Redis配置
Redis持久化
RDB,AOF
Redis事务操作
Redis实现订阅发布
Redis主从复制
Redis哨兵模式(现在公司中所有的集群都用哨兵模式)
缓存穿透及解决方案
缓存击穿及解决方案
缓存雪崩及解决方案
基础API之Jedis详解
Springboot集成Redis操作
实践
一、NoSQL特点
1.解耦
(1)方便拓展(数据之间没有关系,很好扩展)
(2)大数据量 高性能 (Redis一秒写8万次,读取11万次,NoSQL的缓存记录级,是一种细粒度的缓存,性能比较高)
(3)数据类型是多样型的!(不需要事先设计数据库,随取随用)
(4)传统EDBMS和NoSQL
Nosql四大分类
Redis入门
概述:
是什么?
Redis(Remote Dictionary Server),即远程字典服务。是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、key-value数据库,并提供了多种语言的API。
Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
免费开源!是当下最热门的的NoSQL技术之一!也被称为结构化数据库
能干嘛?
1.内存存储、持久化、内存中是断电即失、所以说持久化很重要(rdb、aof)
2.效率高、可用于告诉缓存
3.发布订阅系统
4.地图信息分析
5.计时器、计数器(浏览量)
6.............
下载安装(一般安装在Linux)
测试
基础知识
Redis默认有16个数据库,默认使用第0个,可以使用select进行切换
Redis是单线程的!
Redis是单线程为什么这么快?
1.误区1:高性能 的服务器一定是多线程?
2.误区2:多线程(CPU上下文切换)一定比单项成效率高?
五大数据类型(如果遇到不会命令,可在官网查看)
Redis-key
keys ------查看所有的key
set name zhangsan ------设置key name=zhangsan
set age 12 ------设置key age=12
get name ------查看当前key的值
exists name ------判断当前key是否存在
move name 1 ------移除当前key
expire name 10 ------设置key的过期时间,单位是秒
ttl name ------查看当前key的剩余时间
type name -------查单当前key的一个类型
String (字符串)
APPEND name "hello" -----在key后追加字符串,如果当前key不存在,就相当于set key
STRLEN name -----获取字符串的长度
步长 i++(下面命令可用于设置浏览量)
set views 0 ------ 设置一个key,views=0,初始浏览量为0
incr views ------ 自增一 , 浏览量变为1
incr views ------ 浏览量变为2
decr views ------自减一,浏览量变为1
INCRBY views 10 ------设置自增步长为10,设置后views每次自增10
DECRBY views 5 ------ 设置自减步长为5,设置后views每次自减5
字符串范围 (range)
GETRANGE name 0 3 ------截取字符串 [0,3]
GETRANGE name 0 -1 -------获取全部字符串,同get key
SETRANGE name 1 haha ------替换指定位置开始的字符串
setex (set with expire) ------设置过期时间
setnx (set if not exist) ------不存在时设置(在分布式锁中会常常使用)
mset ------批量设置
mget -------批量获取
mset user:1:name zhangsan user:1:age 21 user:2:name lisi user:2:age 22
批量设置,key=value , user:1:name = zhangsan , user:1:age = 21......
mget user:1:name user:1:age user:2:name user:2:age -----批量获取
getset ----先get再set
getset db redis ------如果不存在值,设置值,返回null
getset db mongodb ------如果存在值,获取原来的值,并设置新的值
List
基本数据类型,列表
在redis里面,我们可以把 list 玩成, 栈 ,队列,阻塞队列!
所有的list命令都是以 L 开头
移除
LPOP ------移除左边(头部)元素
RPOP ------移除右边(尾部)元素
移除指定的值
Lrem
trim ------修剪 (截取) 列表中(LTRIM)
rpoplpush 移除列表最后一个元素,将其移动到新的列表中
LSET ---- 将列表中指定下标的值替换为指定的值,更新操作
如果列表或者元素不存在会报错
LINSERT 插入操作,在某一个具体的value插入到列表中某个元素的前面或者后面
小结:
他实际上是一个链表,before Node after , left , right 都可以插入值
如果key不存在,创建新的链表
如果key存在,新增内容
如果移除了所有值,空链表,也代表不存在!
在两边插入或者改动值,效率最高! 中间元素,相对来说效率会低一点~
消息排队 !消息队列(Lpush Rpop), 栈 (Lpush Lpop)
Set()
set中的值不能重读
rem 移除 set中(srem)
set 无序不可重复,抽随机!
删除指定的key,随机删除key!
将一个指定的值,移动到另一个set集合!smove
数字集合类:
-- 差集 SDIFF
-- 交集 SINTER
-- 并集 SUNION
微博,A用户将所有关注的人放在一个set集合中! 将他的粉丝也放在一个集合中!
共同关注,共同爱好,二度好友,推荐好友! (六度分割理论)
Hash(哈希)
Map集合,key-map!时候这个值是一个map集合! 本质和String 类型没有太大区别,还是一个简单的key-value!
hlen
是否存在
设置增量,,步长
hash变更的数据user name age,尤其是用户信息之类的,经常变动的信息! hash 更适合于对象的存储,String更加适合字符串存储!
Zset(有序集合)
三种特殊数据类型
geospatial只有6个命令