Redis课程内容
1.入门(软件的安装、设置)
2.通用命令
3.基本数据类型及操作
4. Java连接Redis -->jedis
5.持久化
6.删除策略
7.主从复制
8.哨兵与集群
Redis入门
windows Git Hub下载地址:https://github.com/microsoftarchive/redis/releases
Redis的主要作用:缓存数据,是目前缓存的主流技术之一
目前缓存的主流技术:
1. Redis(单线程)
2. Memcached(多线程)
缓存的作用:主要用于改善软件的性能
本地缓存:将热点数据缓存起来,应用程序直接访问而无需访问数据库
分布式缓存:将数据缓存在一个专门的分布式缓存集群中,应用通过网络通信访问缓存数据
Redis的应用场景
- 缓存
- 任务队列
- 应用的排名
- 网站访问统计
- 数据过期处理
NOSQL
泛指非关系型数据库
常用的非关系型数据库
- Redis
- mongoDB
Redis版本结构
相关的设置:
-
设置连接密码
修改redis.windowsconf(客户端配置文件),redis.windows.server.conf(服务端配置文件)中的requirpass参数 Eg: requirpass root
-
测试命令
ping(测试客户端与服务端是否连接成功)
-
配置数据库相关的操作
Redis默认配置了16个数据库,数据库的编号从0开始,即0-15号来表示对应的16个数据库,其默认操作的是0号库
通过 select 5 命令切换到5号库
Redis不支持使用数据库自定义数据库名称
Redis不支持为每个数据库设置访问密码
Redis的多个数据库之间是相对独立与隔离的,担不是完全的隔离,通过Fushall命令会清空全部数据
清除命令 flushall:清空全部数据库 flushDB:只会清空当前操作的库
Redis
特征:
1.多种数据类型的存储
2.内存存储与持久化
-
内存的读写速度远远比硬盘快
-
自动提供了持久化功能(RDB,AOF两种方式)
3.其他功能
- 可用于缓存
- 支持的生存周期
- 先进先出的策略
通用的命令
- select 5 : 命令切换到5号库
- keys * :查询当前库所有的key
- type key : 获取键对应的value的数据类型
- del key[key…] : 删除指定的key value
- get key : 获取值
- set key value : 添加一条记录
- exists key : 判断某个key是否存在 (返回1表示存在,0表示不存在)
- dbsize : 获取当前数据库下存储的数据记录
- quit 退出 ping 测试链接是否成功
基本数据类型及操作:
Redis是NOSQL数据库总较为广泛的非关系型内存数据库,Redis内部是一个Key-Value的形式存储,它支持存储的值(value)类型相对比较丰富:
- String(字符串)
- list(链表)
- set(集合)
- Zset(有序集合[sorted set])
- hash(哈希类型,类似Java中的Map)
字符串类型
字符串是Redis中最基本的数据类型,它能存储任何形式得字符串,包括二进制,JSON格式的对象,字节数组等,其最大允许得数据容量是512M
set key value
get key
字符串类型常用命令 | 作用 |
---|---|
incr key | 递增1 |
incrby key | 增加指定的正数 |
decr key | 递减1 |
decrby key | 减少指定的正数 |
append key value | 向尾部追加值 |
strlen key | 获取字符串的长度 |
mset | 添加多个数据 |
mget | 获取多个数据 |
命令的详解:
-
incr key 递增1
此命令的前提是存储的字符串是整数才能使用,起做ring是让当前键值递增,并返回递增后的值
127.0.0.1:6379> set classVIP 1 OK 127.0.0.1:6379> incr classVIP (integer) 2 127.0.0.1:6379> incr classVIP (integer) 3 127.0.0.1:6379> incr classVIP (integer) 4 127.0.0.1:6379> incr classVIP (integer) 5 127.0.0.1:6379> get classVIP "5"
-
incrby key 增加制定的正数
127.0.0.1:6379> incrby classVIP 10 (integer) 15 127.0.0.1:6379> incrby classVIP 100 (integer) 115
-
decr key 递减1 ,decrby递减指定的值
-
append key value 向尾部追加值,如果key不存在则创建key.若key存在则在数值后面添加value(返回的值是字符串的总长度)
127.0.0.1:6379> append str "Hello" (integer) 5 127.0.0.1:6379> get str "hello" 127.0.0.1:6379> append str "Redis" (integer) 10 127.0.0.1:6379> get str "HelloRedis"
-
strlen key 获取字符串的长度
127.0.0.1:6379> strlen str (integer) 10
-
mset 、mget
格式:mset k1 v1 k2 v2
mget k1 k2
127.0.0.1:6379> mset k1 v1 k2 v2 OK 127.0.0.1:6379> mget k1 k2 1) "v1" 2) "v2"
list链表
list链表是有序的,按照插入的顺序来进行存储,可以添加元素到列表的头部(左边),或者尾部(右边).并且数据内容可以重复
list链表常用命令 | 作用 |
---|---|
lpush key value | 头部追加 |
rpush key value | 尾部追加 |
lrange key index1 index2 | 分页(遍历) |
lrem key index value | 删除数据 |
rpop key | 删除最后一条数据 |
index为下标
命令的详解:
-
lpush key value : 头部追加一条数据(左侧)
127.0.0.1:6379> lpush listDemo redis (integer) 1
-
rpush key value : 尾部追加一条数据(右侧)
127.0.0.1:6379> rpush listDemo mybatis (integer) 2
-
lrange key index1 index2 (index为下标) : 查询遍历下标从0开始
127.0.0.1:6379> lrange listDemo 0 3 1) "springMVC" 2) "redis" 3) "mybatis"
-
lrem listDemo index value : 移除下标对应的数据(正数从左侧开始,负数从右侧开始)
127.0.0.1:6379> lrange listDemo 0 3 1) "Boot" 2) "spring" 3) "redis" 4) "mybatis" 127.0.0.1:6379> lrem listDemo -1 spring ##移除从尾部到表头的第一个spring (integer) 1 127.0.0.1:6379> lrange listDemo 0 2 1) "Boot" 2) "redis" 3) "mybatis" 127.0.0.1:6379>
链表(list)的应用场景:
- 利用lrange可以实现分页操作
- 博客系统中,博客的评论就可以放在一个list中
- 微信朋友圈的点赞,按照点赞顺序显示点赞好友的信息
set无序集合(不可重复)
set类型中提供了无序的方式来存储多个不同(不能存储重复的元素)的元素,set集合可以快速添加、删除、检查某个元素是否存在,取交集,并集,差集。
set无序集合常用命令 | 作用 |
---|---|
sadd key value[value…] | 添加一条或多条数据 |
smembers key | 查询遍历 |
srem key value[value…] | 删除一条数据或多条数据 |
sismember key value | 判断是否有这个值 |
srandmember key [num] | 随机取值 [随即取出num条值] |
scard key | 获取集合中数据的长度(个数) |
spop key | 随机获取一条值并删除 |
命令的详解:
-
sadd key value[value…] : 添加一条或多条数据
127.0.0.1:6379> sadd setDemo str1 (integer) 1 127.0.0.1:6379> sadd setDemo str2 str3 str4 str5 (integer) 4
-
smembers key :查询遍历数据
127.0.0.1:6379> smembers setDemo 1) "str3" 2) "str4" 3) "str2" 4) "str1" 5) "str5"
-
srem key value : 根据value值删除数据
127.0.0.1:6379> srem setDemo str2 ##删除setDemo里的str2值 (integer) 1
-
sismember key value : 判断是否有这个值(返回1表示有,0表示没有)
127.0.0.1:6379> sismember setDemo str4 ##判断setDemo里有没有str4 (integer) 1 127.0.0.1:6379> sismember setDemo str2 ##判断setDemo里有没有str2 (integer) 0
-
srandmember key [num] : 随机取一个或多个值
127.0.0.1:6379> srandmember setDemo "str1" 127.0.0.1:6379> srandmember setDemo "str1" 127.0.0.1:6379> srandmember setDemo "str5" 127.0.0.1:6379> srandmember setDemo 3 1) "str5" 2) "str4" 3) "str1" 127.0.0.1:6379> srandmember setDemo 3 1) "str3" 2) "str4" 3) "str1"
-
scard key : 获取几个中数据的长度(个数)
127.0.0.1:6379> scard setDemo (integer) 4
-
spop key : 随机获取一条值并删除
127.0.0.1:6379> smembers setDemo 1) "str5" 2) "str1" 3) "str3" 4) "str4" 127.0.0.1:6379> spop setDemo "str1" 127.0.0.1:6379> smembers setDemo 1) "str5" 2) "str3" 3) "str4"
Zset有序集合(sorted set)(不可重复)
有序集合和set集合一样也是String类型元素的集合,不允许重复
Zset集合中的元素都会关联一个double类型的分数,redis会通过这个分数来为集合中的成员进行从小到大的排序
Zset有序集合(sorted set)常用命令 | 作用 |
---|---|
zadd key index value | 添加一条数据 |
zrange key index1 index2 | 分页,遍历 (和list分页相同) |
zrem key value | 删除数据 |
zcard key | 获取集合中数据的长度(个数) |
zcount key index1 index2 | 获取指定范围下标的个数 |
hash(哈希) 结构:Map<String,Map<String,value>>
hash类型也叫散列类型,存储的是key/value结构,hash存的是字符串与字符串值之间的映射,特别适合存储对象
Eg : 存储user对象(用户的相关信息) Map(String,map<String,String>)
hash(哈希)常用命令 | 作用 |
---|---|
hset key key value ===> Map(String,map<String,String>) | 添加一条信息 |
hexists key key | 判断某个字段是否存在 |
hincrby key key | 增加指定的正数(第二个key需为整数) |
hdel key key | 删除 |
hkeys key | 获取key |
hvals key | 获取值 |
hlen key | 获取字段的数量 |
命令详解:
-
hset key key value
127.0.0.1:6379> hset user username gx (integer) 1
-
hexists key key : 判断某个字段是否存在 第一个key为user,第二个key为username
127.0.0.1:6379> hexists user username ### 判断username字段是否存在 (integer) 1
-
hincrby key key : 增加指定的正数(第二个key需为整数)
127.0.0.1:6379> hset user age 28 (integer) 1 127.0.0.1:6379> hincrby user age 2 (integer) 30
-
hdel key key : 删除指定的key
127.0.0.1:6379> hdel user age (integer) 1
-
hkeys key : 获取key
127.0.0.1:6379> hkeys user 1) "username"
-
hvals key : 获取值
127.0.0.1:6379> hvals user 1) "gx"
-
hlen key : 获取字段的数量
127.0.0.1:6379> hlen user (integer) 1
持久化
什么是持久化
利用永久存储介质将数据进行保存,在特定时间保存的数据进行读取的过程称为持久化
作用:
防止数据的意外丢失,确保数据安全
Redis的持久化方式:
-
RDB(快照) ==》数据 Eg:idea
将当前数据状态进行保存,快照形式,存储数据结构,存储格式简单,关注点在数据
-
AOF(日志) ==》过程 Eg:eclipse
将数据的操作过程进行保存,日志形式,存储操作过程,存储格式复杂,关注点在数据的操作过程中
虚拟机是以快照的方式来持久化,但是在写文档的时候撤销操作时,返回上一步是AOF方式
生命周期
所谓的生命周期指的是键值对有效期,在redis中可以使用expire命令设置一个键值对的生存时间,到时间后redis会自动删除该记录
expire key1 100 ##key1在100秒后过期 单位:秒
ttl key1 ##查看key1剩余的存活时间
ttl命令会返回三种值:
-2:表示已经删除
-1:永久有效
大于0的值:剩余的存活时间
pexpire 设置有效时间(单位:毫秒)
Eg: pexpire key2 60000 ##有效期为60000毫秒
pttl key2 ##查看有效时间
persist key2 ##清除key2的过期时间,变成长期有效
时间戳(某一个时间点)方式表示 Eg: 1598963627 ====》2020-09-01 20:33:47
expireat key 1598963627
直接通过ttl查看剩余存活时间
pexpireat key 时间戳(毫秒)
时间戳相当于定时器,普通的相当于秒表的方式
Redis数据类型综合案例
setex key 60 1 ###setex设置key的默认值存活时间60秒值为1
1.怎么限制每个用户每分钟最多发起10次调用???
思路:此处借用Long类型存储的最大值的特征来进行次数的限制判断
使用setex设置key的默认存活时间60秒,设置value为Long最大值减10,使用incr key递增,当key的值达到最大值时,再次执行就会溢出报错
Java连接Redis -->Jedis
方式:
jedis
Spring Data Redis
lettuce
redis支持的开发语言
java,C#,C++,C,PHP,Python,GO,swif/Object-c,VB
//1.连接
Jedis jedis = new Jedis("127.0.0.1", 6379); //连接地址 端口号
jedis.auth("root"); //连接库的密码
Redis数据库的连接池
Redis事务
概念:
Redis事务的本质是一组命令的集合,事务支持一次性执行多个命令,一个事物中的所有命令都会被序列化,在食物执行的过程中,会按照串行的方式顺序的执行队列中的命令
总结:redis事务就是一次性,顺序性,排他性的执行一个队列中一系列的命令
Redis不能保证原子性:
redis中单条命令就是原子性执行,但在事务中不能保证原子性
没有回滚操作,事务中任意命令执行失败,其他命令还是会执行.
命令 | 作用 |
---|---|
multi | 开启事务 |
exec | 执行事务 |
discard | 取消当前事务 |