不管什么时候学习都不晚
【Redis】
主要内容
- Redis简介
- 使用Redis作为缓存工具时流程
- Redis单机版安装
- Redis数据类型
- Redis持久化策略
- Redis主从复制
- 哨兵
- 集群
- Jedis
- Spring Boot整合Spring Data Redis
- 缓存穿透
- 缓存击穿
- 缓存雪崩
一、Redis简介
1. NoSQL简介
目前市场主流数据存储都是使用关系型数据库。每次操作关系型数据库时都是I/O操作,I/O操作是主要影响程序执行性能原因之一,连接数据库关闭数据库都是消耗性能的过程。尽量减少对数据库的操作,能够明显的提升程序运行效率。
针对上面的问题,市场上就出现了各种NoSQL(Not Only SQL,不仅仅可以使用关系型数据库)数据库,它们的宣传口号:不是什么样的场景都必须使用关系型数据库,一些特定的场景使用NoSQL数据库更好。
常见NoSQL数据库:
- memcached :键值对,内存型数据库,所有数据都在内存中。
- Redis:和Memcached类似,还具备持久化能力。
- HBase:以列作为存储。
- MongoDB:以Document做存储。
2. Redis简介
Redis是以Key-Value形式进行存储的NoSQL数据库。
Redis是使用C语言进行编写的。
平时操作的数据都在内存中,效率特高,读的效率110000/s,写81000/s,所以多把Redis当做缓存工具使用。
Redis以solt(槽)作为数据存储单元,每个槽中可以存储N多个键值对。Redis中固定具有16384。理论上可以实现一个槽是一个Redis。每个向Redis存储数据的key都会进行crc16算法得出一个值后对16384取余就是这个key存放的solt位置。
同时通过Redis Sentinel(哨兵)提供高可用,通过Redis Cluster(集群)提供自动分区。
二、 使用Redis作为缓存工具时流程(写代码时思路)
- 应用程序向Redis查询数据
- 判断Key是否存在
- 是否存在
- 存在
- 把结果查询出来
- 返回数据给应用程序
- 不存在
- 向MySQL查询数据
- 把数据返回给应用程序
- 把结果缓存到Redis中
三、Redis单机版安装
1. 安装依赖:C语言依赖
- redis使用C语言编写,所以需要安装C语言库
# yum install -y gcc-c++ automake autoconf libtool make tcl
2. 上传并解压
- 把redis-5.0.5.tar.gz上传到/usr/local/tmp中
- 解压文件
# cd /usr/local/tmp
# tar zxf redis-5.0.5.tar.gz
3. 编译并安装
- 进入解压文件夹
# cd /usr/local/tmp/redis-5.0.5/
- 编译
# make
- 安装,PREFIX表示把软件安装到哪里
# make install PREFIX=/usr/local/redis
4. 开启守护进程
- 复制cd /usr/local/tmp/redis-5.0.5/中redis.conf配置文件
# cp redis.conf /usr/local/redis/bin/
- 修改配置文件
# cd /usr/local/redis/bin/
# vim redis.conf
- 把daemonize的值由no修改为yes
5. 修改外部访问
在redis5中需要修改配置文件redis.conf允许外部访问。需要修改两处。
1)注释掉bind 127.0.0.1
2)protected-mode yes 改成 no
6. 启动并测试
启动redis,千万不要忘记配置文件,默认不自动加载配置文件。
# ./redis-server redis.conf
重启redis
# ./redis-cli shutdown
# ./redis-server redis.conf
启动客户端工具
#./redis-cli
在redis5中客户端工具对命令会有提供功能。
四、Redis数据类型(面试问题)
Redis中数据是key-value形式。不同类型Value是有不同的命令进行操作。
key为字符串类型,value可取类型:
- String 字符串
- Hash 哈希表
- List 列表
- Set 集合
- Sorted Set 有序集合
Redis命令相关手册有很多,下面为其中比较好用的两个
Redis中命令有很多,抽取出部分进行讲解。
1. Key操作
1.1 exists
判断key是否存在。
- 语法:exists key名称
- 返回值:存在返回数字,不存在返回0
1.2 expire
设置key的过期时间,单位秒
- 语法:expire key 秒数
- 返回值:成功返回1,失败返回0
1.3 ttl
查看key的剩余过期时间
- 语法:ttl key
- 返回值:返回剩余时间,如果不过期返回-1
1.4 del
根据key删除键值对。
- 语法:del key
- 返回值:被删除key的数量
2. 字符串值(String)
2.1 set
设置指定key的值。如果key不存在是新增效果,如果key存在是修改效果。键值对是永久存在的。
- 语法:set key value
- 返回值:成功OK
2.2 get
获取指定key的值
- 语法:get key
- 返回值:key的值。不存在返回nil
2.3 setnx
当且仅当key不存在时才新增。恒新增,无修改功能。
- 语法:setnx key value
- 返回值:不存在时返回1,存在返回0
2.4 setex
设置key的存活时间,无论是否存在指定key都能新增,如果存在key覆盖旧值。同时必须指定过期时间。
- 语法:setex key seconds value
- 返回值:OK
3. 哈希表(Hash)
Hash类型的值中包含多组field value。
3.1 hset
给key中field设置值。
- 语法:hset key field value
- 返回值:成功1,失败0
3.2 hget
获取key中某个field的值
- 语法:hget key field
- 返回值:返回field的内容
3.3 hmset
给key中多个filed设置值
- 语法:hmset key field value field value
- 返回值:成功OK
3.4 hmget
一次获取key中多个field的值
- 语法:hmget key field field
- 返回值:value列表
3.5 hvals
获取key中所有field的值
- 语法:hvals key
- 返回值:value列表
3.6 hgetall
获取所有field和value
- 语法:hgetall key
- 返回值:field和value交替显示列表
3.7 hdel
删除key中任意个field
- 语法:hdel key field field
- 返回值:成功删除field的数量
4. 列表(List)
4.1 Rpush
向列表末尾中插入一个或多个值
- 语法;rpush key value value
- 返回值:列表长度
4.2 lrange
返回列表中指定区间内的值。可以使用-1代表列表末尾
- 语法:lrange list 0 -1
- 返回值:查询到的值
4.3 lpush
将一个或多个值插入到列表前面
- 语法:lpush key value value
- 返回值:列表长度
4.4 llen
获取列表长度
- 语法:llen key
- 返回值:列表长度
4.5 lrem
删除列表中元素。count为正数表示从左往右删除的数量。负数从右往左删除的数量。
- 语法:lrem key count value
- 返回值:删除数量。
5. 集合(Set)
set和java中集合一样
5.1 sadd
向集合中添加内容。不允许重复。
- 语法:sadd key value value value
- 返回值:集合长度
5.2 scard
返回集合元素数量
- 语法:scard key
- 返回值:集合长度
5.3 smembers
查看集合中元素内容
- 语法:smembers key
- 返回值:集合中元素
6. 有序集合(Sorted Set)
有序集合中每个value都有一个分数(score),根据分数进行排序。
6.1 zadd
向有序集合中添加数据
- 语法:zadd key score value score value
- 返回值:长度
6.2 zrange
返回区间内容,withscores表示带有分数
- 语法:zrange key 区间 [withscores]
- 返回值:值列表
需要更多Java学习资料的可以到评论区留言或者私信哦,视频、源码、项目,通通都给你