前导
视频学习:
黑马程序员Redis入门到实战教程,深度透析redis底层原理+redis分布式锁+企业解决方案+黑马点评实战项目_哔哩哔哩_bilibili
【狂神说Java】Redis最新超详细版教程通俗易懂_哔哩哔哩_bilibili
黑马讲的很详细,但是内容太多了,看到jedis就没看了,然后去看了狂神的,感觉讲的很基础,只能算入门。
文章学习 :
Redis 所有常用命令总结(快速增删改查,定义 + 举例)_redis del 替换-CSDN博客
NoSQL与Redis
NoSQL
NoSQL常见的解释有Non-Relational SQL或者Not Only SQL,不过Not Only SQL被更多人接受,一般泛指非关系型数据库。它和关系型数据库不同的是,不保证关系数据的ACID特性。
ACID:深入学习MySQL事务:ACID特性的实现原理 - 编程迷思 - 博客园 (cnblogs.com)
- 原子性(Atomicity,或称不可分割性)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability
NoSQL数据库的产生就是为了解决超大规模和高并发系统中多重数据种类带来的挑战,特别是大数据应用的难题。目前具有代表性的NoSQL数据库有Redis、HBase、ES、MongoDB等等。
主流的NoSQL数据库可以分为四大类:K-V键值数据库、列存储数据库、文档数据库和图形数据库。
Redis
Redis是一个基于 C 语言开发的开源数据库(BSD 许可),与传统数据库不同的是 Redis 的数据是存在内存中的(内存数据库),读写速度非常快,被广泛应用于缓存方向。并且,Redis 存储的是 KV 键值对数据。
为了满足不同的业务场景,Redis 内置了多种数据类型实现(比如 String、Hash、Sorted Set、Bitmap)。并且,Redis 还支持事务 、持久化、Lua 脚本、多种开箱即用的集群方案(Redis Sentinel、Redis Cluster)。Redis也可以实现数据写入磁盘中,保证了数据的安全不丢 失,而且Redis的操作是原子性的。
Redis安装和启动
前台启动 redis-server [--port 6379]//默认127.0.0.1 6379不使用
后台启动 1)修改redis.conf中的守护进程 2)redis-server [xx/redis.conf]
开机自启
Redis常用命令和数据结构
常用命令
不区分大小写
redis安装完成后自带命令行客户端:redis-cli
redis-cli [-h 127.0.0.1 -p 6379] //客户端连接redis
shutdown //在客户端停止redis
help @generic //获取通用命令的帮助文档 通用命令是所有数据类型都可使用
keys pattern //获取所有键
keys *
* 作为通配符,表示任意字符,因为其会遍历所有键,然后显示所有键列表,时间复杂度O(n),数据量过大的环境,谨慎使用
dbsize //获取键总数
exists key [key …] //判断当前 key 是否存在 返回存在个数
move key db //移动键
//注:Redis 默认有 16 个数据库 move 代表移动到其中哪个去,然后 select 代表切换到这个数据库
del key [key …] //移动键
expire test 120 //设置过期时间(秒)
ttl key //查询key的生命周期(秒)
rename key newkey //rename key newkey
flushdb //清除当前数据库
flushall //清除全部数据库的内容
数据结构
String
Hash
List
Set
SortedSet
GEO
getpos key 经度 纬度
geodist key1 key2(场景 :好友距离)
georadius (场景:我附近的人,一般通过半径实现,radius 半径)
Hyperloglog
场景:统计网页的UV 网页访问量 同一个人可能访问多次
Hyperloglog不存储元素本身 有错误率 0.81%
Bitmaps
Redis 中 BitMap 的使用场景 - 程序员自由之路 - 博客园 (cnblogs.com)
场景:用户签到,统计活跃用户
setbit key 0(偏移值) 1(1/0)
bitcount key 统计为1的位数
事务
redis事务特点
Redis之事务(详细解析)_什么是redis事务-CSDN博客 (这篇写的...有点问题,懒的找官网看了)
深入理解Redis事务、事务异常、乐观锁、管道-CSDN博客
(1) 事务提供了一种将多个命令打包,然后一次性、有序地执行的机制。
(2) 多个命令会被人队到事务队列中, 然后按先进先出(FIFO)的顺序执行。
(3) 事务在执行过程中不会被中断,当事务队列中的所有命令都被执行完毕之后,事务才会结束。
(4) 带有WATCH命令的事务会将客户端和被监视的键在数据库的watched_keys字典关联,当键被修改时,程序会将所有监视被修改键的客户端的REDIS_DIRTY_CAS标识打开,服务只有在REDIS_DIRTY_CAS标识没有打开时,才会执行客户端提交的事务,否则服务器拒绝执行事务。
(5) Redis事务不支持回滚机制。
事务命令操作
multi //开启事务
其他命令... //命令入队
exec //执行
discard //放弃事务
redis事务异常
语法错误 :语法错误(代码写错了)导致整个事务执行失败,非回滚操作
运行时异常:如(1/0)可以执行,错误命令不执行,非语法错误引起的部分失败,无法保证ACID中的A,无回滚机制
Redis乐观锁
悲观锁:很悲观,认为数据大概率会有并发一致性问题,首次请求过来时加具有互斥性的锁阻塞其它并发请求,但是Redis是高性能组件,阻塞会带来性能问题,所以不用悲观锁。
乐观锁:乐观,认为数据小概率有并发一致性问题,所以读数据时不上锁,但是写数据时,会判断一下这个数据是否被改动,从而在旧值的基础上做修改,如果数据被改动,则失败掉此次执行。
注意:redis在事务exec或者discard,都会取消对key的watch操作。
解决问题:高并发读多写少场景下Redis数据一致性问题。
乐观锁:需要监控(watch)数据是否改变
set money 100 //设置kv
watch money //监控k
multi //开启事务
//操作kv
exec //执行事务 事务正常结束,数据期间没有发生变动,可以正常执行成功
如果期间有其他操作修改了Key 导致执行失败 先放弃监视 再开启监视
unwatch //放弃
watch money
Jedis和Springboot整合
Jedis
Redis深入学习:Jedis和Spring的RedisTemplate_jedis的api,或者redistemplate的api-CSDN博客
在 JavaWeb 中实现对 Redis 的操作,主要有两种方式:Jedis和RedisTemplate。Jedis是Redis官方推荐的面向Java操作Redis的客户端开发Jar包;
而RedisTemplate是Spring框架对Jedis API的进行了高度封装,支持连接池自动管理,我们可以在Spring应用中通过简单的连接池配置信息就能访问Redis服务并进行相关缓存操作。也就是Spring的spring-data-redis的相关Jar包,它还默认提供了两个使用Redis的类StringRedisTemplate和RedisTemplate,其中RedisTemplate可以支持Redis没有的缓存对象的操作,而StringRedisTemplate用来存储字符串
Spring Data
默认提供了两个使用Redis的类StringRedisTemplate和RedisTemplate,其中RedisTemplate可以支持Redis没有的缓存对象的操作,而StringRedisTemplate用来存储字符串
整合测试
持久化
持久化常常指的是将内存中的数据保存到硬盘或其他长期存储介质中,从而确保即使在系统崩溃、断电或其他突发事件中,数据也不会丢失。
在主从复制中,rdb就是备用到从机上,而aof一般不使用
RDB操作
RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。
一般默认RDB,不修改配置
rdb保存的文件是dump.rdb
AOF操作
AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。你甚至可以关闭持久化功能,让数据只在服务器运行时存在。
Redis发布订阅
主从复制和哨兵
主从复制
环境配置:配置三个config文件
哨兵
手动选主机
自动选主机
配置哨兵
Redis缓存穿透和雪崩
还是看别人的总结吧