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的应用场景

  1. 缓存
  2. 任务队列
  3. 应用的排名
  4. 网站访问统计
  5. 数据过期处理

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

获取多个数据

命令的详解:
  1. 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"
  1. incrby key 增加制定的正数
127.0.0.1:6379> incrby classVIP 10
(integer) 15
127.0.0.1:6379> incrby classVIP 100
(integer) 115
  1. decr key 递减1 ,decrby递减指定的值
  2. 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"
  1. strlen key 获取字符串的长度
127.0.0.1:6379> strlen str
(integer) 10
  1. 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为下标

命令的详解:
  1. lpush key value : 头部追加一条数据(左侧)
127.0.0.1:6379> lpush listDemo redis
(integer) 1
  1. rpush key value : 尾部追加一条数据(右侧)
127.0.0.1:6379> rpush listDemo mybatis
(integer) 2
  1. lrange key index1 index2 (index为下标) : 查询遍历下标从0开始
127.0.0.1:6379> lrange listDemo 0 3
1) "springMVC"
2) "redis"
3) "mybatis"
  1. 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

随机获取一条值并删除

命令的详解:
  1. 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
  1. smembers key :查询遍历数据
127.0.0.1:6379> smembers setDemo
1) "str3"
2) "str4"
3) "str2"
4) "str1"
5) "str5"
  1. srem key value : 根据value值删除数据
127.0.0.1:6379> srem setDemo str2 ##删除setDemo里的str2值
(integer) 1
  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
  1. 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"
  1. scard key : 获取几个中数据的长度(个数)
127.0.0.1:6379> scard setDemo
(integer) 4
  1. 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>

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

获取字段的数量

命令详解:
  1. hset key key value
127.0.0.1:6379> hset user username gx
(integer) 1
  1. hexists key key : 判断某个字段是否存在 第一个key为user,第二个key为username
127.0.0.1:6379> hexists user username ### 判断username字段是否存在
(integer) 1
  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
  1. hdel key key : 删除指定的key
127.0.0.1:6379> hdel user age
(integer) 1
  1. hkeys key : 获取key
127.0.0.1:6379> hkeys user
1) "username"
  1. hvals key : 获取值
127.0.0.1:6379> hvals user
1) "gx"
  1. 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

取消当前事务

java jedis 链接 java怎么连接redis_redis