黑马redis学习笔记

黑马redis学习笔记

redis 简介

Nosql

NoSQL:即 Not-Only SQL( 泛指非关系型的数据库),作为关系型数据库的补充。

特征:

  • 可扩容,可伸缩
  • 大数据量下高性能
  • 灵活的数据模型
  • 高可用

Nosql 作用:应对基于海量用户和海量数据前提下的数据处理问题。 常见 Nosql 数据库:

  • Redis
  • memcache
  • HBase
  • MongoDB

解决方案(电商场景)

image-20210802191414115

Redis

概念:Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库。

特征:

  1. 数据间没有必然的关联关系
  2. 内部采用单线程机制进行工作
  3. 高性能。官方提供测试数据,50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/s。
  4. 多数据类型支持

 字符串类型 string  列表类型 list  散列类型 hash  集合类型 set  有序集合类型 sorted_set

  1. 持久化支持。可以进行数据灾难恢复

Redis应用

  • 为热点数据加速查询(主要场景),如热点商品、热点新闻、热点资讯、推广类等高访问量信息等
  • 任务队列,如秒杀、抢购、购票排队等
  • 即时信息查询,如各位排行榜、各类网站访问统计、公交到站信息、在线人数信息(聊天室、网站)、设 备信号等
  • 时效性信息控制,如验证码控制、投票控制等
  • 分布式数据共享,如分布式集群架构中的 session 分离
  • 消息队列
  • 分布式锁

redis下载和安装

docker安装

# 拉取镜像
docker pull redis
# 数据卷准备
mkdir -p /mydata/redis/conf
touch /mydata/redis/conf/redis.conf
echo "appendonly yes"  >> /mydata/redis/conf/redis.conf
# 启动
docker run -p 6379:6379 --name redis -v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf

# 进入容器内部客户端
docker exec -it redis redis-cli

# 自启 
docker update redis --restart=always

redis基本操作

# 添加, 再此设置同一个key就会覆盖
set key value

# 得到
get key


# 清屏
clear

# 帮助信息
help 命令名
help get

help @组名
help @String

# 退出

quit
exit
<ESC>

Redis 数据类型及操作

string

  • 存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型
  • 存储数据的格式:一个存储空间保存一个数据
  • 存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用

image-20210722080310219

基本操作

# 1.单指定操作
# 添加/修改操作
set key value
# 获取数据
get key
# 删除数据 
del key

# 2.多指令操作
# 添加修改多个数据
mset key1 value1 key2 value2 …
# 获取多个数据
mget key1 key2 …

# 获取数据字符个数(字符串长度)
strlen key、
# 追加信息到原始信息后部(如果原始信息存在就追加,否则新建)
append key value

扩展操作

1.设置数值数据增加指定范围的值
# 整数自增,默认为1
incr key
# 指定增加值,必须为整数
incrby key increment
# 指定增加小数
incrbyfloat key increment

2.设置数值数据减少指定范围的值
decr key
decrby key increment



3. 设置数据具有指定的生命周期
# 秒
setex key seconds value
# 毫秒
psetex key milliseconds value

注意事项

image-20210722082050846

hash

基本操作

# 添加/修改数据
hset key field value

# 获取数据
hget key field
# 获取一个key的所有值
hgetall key

# 删除数据
hdel key field1 [field2]


# 添加/修改多个数据
hmset key field1 value1 field2 value2 …

# 获取多个数据
hmget key field1 field2 …

# 获取哈希表中字段的数量
hlen key

# 获取哈希表中是否存在指定的字段
hexists key field

hash 类型数据扩展操作

# 获取哈希表中所有的字段名或字段值
hkeys key
hvals key  
#值可能重复

# 设置指定字段的数值数据增加指定范围的值  正数负数都行
hincrby key field increment
hincrbyfloat key field increment
she

# 存在字段就失败,不存在就添加
hsetnx key field value

注意事项

  1. hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到, 对应的值为(nil)
  2. hash 类型数据操作的注意事项
  3. 每个 hash 可以存储 2 32 - 1 个键值对
  4. hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存 储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
  5. hgetall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,有可能成为数据访问 瓶颈

list

  • 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
  • 需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序
  • list类型:保存多个数据,底层使用双向链表存储结构实现

基本操作

# 添加/修改数据
# 左添加
lpush key value1 [value2] ……  
# 右添加
rpush key value1 [value2] ……

# 获取数据
# start stop 是索引,最后一个索引可以是 -1
lrange key start stop
lindex key index
# 获取长度
llen key


# 获取并移除数据
lpop key
rpop key

扩展操作

阻塞式获取

# 规定时间内获取并移除数据

blpop key1 [key2] timeout
brpop key1 [key2] timeout
brpoplpush source destination timeout

list 类型数据扩展操作

业务场景

image-20210802191442870

从中间拿数据?

# 移除指定数据
# count:移除几个 value:移除哪个值
# 比如有多个同样的value,从左删除几个
lrem key count value

Tips 6: redis 应用于具有操作先后顺序的数据控制

list 类型数据操作注意事项

  • list中保存的数据都是string类型的,数据总容量是有限的,最多2 32 - 1 个元素 (4294967295)。
  • list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作
  • 获取全部数据操作结束索引设置为-1
  • list可以对数据进行分页操作,通常第一页的信息来自于list,第2页及更多的信息通过数据库的形式加载

list 类型应用场景

image-20210802191501807

set

  • 新的存储需求:存储大量的数据,在查询方面提供更高的效率
  • 需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询
  • set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的

基本操作

# 添加数据
sadd key member1 [member2]
# 获取全部数据
smembers key
# 删除数据
srem key member1 [member2]
# 获取集合数据总量
scard key
# 判断集合中是否包含指定数据
sismember key member

set 类型数据的扩展操作

image-20210802191517081

解决方案

# 随机获取集合中指定数量的数据
srandmember key [count]
# 随机获取集合中的某个数据并将该数据移出集合
spop key [count]

set 类型数据的扩展操作

解决方案

求两个集合的交、并、差集

# 交集 A∩B
sinter key1 [key2]
# 并集 A∪B
sunion key1 [key2]
# 差集 A-B A里面有B里面没有
sdiff key1 [key2]

求两个集合的交、并、差集并存储到指定集合中

# destination是一个存储的目的集合的
keysinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2]

将指定数据从原始集合中移动到目标集合中

smove source destination member

set 类型数据操作的注意事项

  • set 类型不允许数据重复,如果添加的数据在 set 中已经存在,将只保留一份
  • set 虽然与hash的存储结构相同,但是无法启用hash中存储值的空间

set 类型应用场景

image-20210730220000455

sorted_set

  • 新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式
  • 需要的存储结构:新的存储模型,可以保存可排序的数据
  • sorted_set类型:在set的存储结构基础上添加可排序字段

score不用来存储数据

基本操作

# 添加数据
zadd key score1 member1 [score2 member2]
# 获取全部数据,可以选择是否带
scorezrange key start stop [WITHSCORES]  # 升序
zrevrange key start stop [WITHSCORES]   #降序操作
# 删除数据
zrem key member [member ...]
# 按条件获取数据 limit限制数量
zrangebyscore key min max [WITHSCORES] [LIMIT]
zrevrangebyscore key max min [WITHSCORES]
# 条件删除数据
zremrangebyrank key start stopzremrangebyscore key min max
# 获取集合数据总量
# 获得总数
zcard key
# 根据score的范围查
zcount key min max
# 集合交、并操作
# 交集的score求和
zinterstore destination numkeys key [key ...]
# 并集的score求和
zunionstore destination numkeys key [key ...]

sorted_set 类型数据的扩展操作

image-20210731185855806

# 获取数据对应的索引(排名)
zrank key member
zrevrank key member #降序
# score值获取与修改
zscore key member
zincrby key increment member 
#修改score

注意事项

  • score保存的数据存储空间是64位,如果是整数范围是-9007199254740992~9007199254740992
  • score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时 候要慎重
  • sorted_set 底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反 复覆盖,保留最后一次修改的结果,value没进去,但score改了

sorted_set 类型应用场景

image-20210731212127363

image-20210731212934730

image-20210731213108697

image-20210731213333199

这样无法保证原子性操作,得到的与删除的不是同一个

image-20210731213512469

简单说就是保证score的长度相同

数据类型案例

image-20210731214128721

image-20210731214306701

image-20210731214605357

image-20210731214805221

利用数据值上限的规则来判断,一分钟后,再重新设置

image-20210731215044996

image-20210731215102466

image-20210731220242057

image-20210731220558655

image-20210731220730578

key操作

key通用操作

# 删除指定key
del key

# 获取key是否存在
exists key

# 获取key的类型
type key

# 为指定key设置有效期
expire key seconds
pexpire key milliseconds
expireat key timestamp
pexpireat key milliseconds-timestamp
# 获取key的有效时间
ttl key  # 返回三个值:剩余时间,(-2)不存在,(-1)未设置有效期
pttl key

# 切换key从时效性转换为永久性
persist key

key扩展操作

keys pattern

image-20210731222519563

key其他操作

# 为key改名
rename key newkey  # 改成一个存在的名字会覆盖掉哪个存在的
renamenx key newkey  # 不会覆盖

# 对所有key排序,只是排顺序,没有对元数据操作
sort  
# 其他key通用操作
help @generic

数据库

image-20210731223847926

db基本操作

# 切换数据库
select index

# 其他操作

# 退出
quit
# cli和服务器是否连通
ping
# 输出日志
echo message 

# 有多少个key
dbsize
# 数据移动
move key db

# 数据清除(危险)

# 删除本地的信息
flushdb
# 删除所有数据库的信息
flushall

Jedis

helloworld

public void testJedis(){        // 1.连接redis        Jedis jedis = new Jedis("192.168.10.188", 6379);        // 2.操作redis        jedis.set("name","ls");        String name = jedis.get("name");        System.out.println(name);        // 3.关闭redis     	jedis.close();    }

其他操作与shell命令一样

Redis持久化

持久化简介

redis数据是在内存中的,可能会断电数据丢失,就需要将数据存到硬盘上

保存的方式:

​ RDB(快照):定时将数据持久化到硬盘中

​ AOP(日志):保存操作的过程

RDB

save命令

命令

save

作用:手动执行一次保存操作

保存在一个.rdb的文件中

image-20210801181713058

save指令相关配置(添加到配置文件中)

dbfilename dump.rdb
说明:设置本地数据库文件名,默认值为 dump.rdb
经验:通常设置为dump-端口号.rdb

dir
说明:设置存储.rdb文件的路径
经验:通常设置成存储空间较大的目录中,目录名称data

rdbcompression yes

说明:设置存储至本地数据库时是否压缩数据,默认为 yes,采用 LZF 压缩
经验:通常默认为开启状态,如果设置为no,可以节省 CPU 运行时间,但会使存储的文件变大(巨大)

rdbchecksum yes
说明:设置是否进行RDB文件格式校验,该校验过程在写文件和读文件过程均进行
经验:通常默认为开启状态,如果设置为no,可以节约读写性过程约10%时间消耗,但是存储一定的数据损坏风险

# 指定端口号port 6379# 指定文件名dbfilename dump-6379.rdb# 指定文件路径dir /data# 压缩rdbcompression yes# 检查rdbchecksum yes

save指令工作原理

image-20210801183751912

如何解决 ?

bgsave

后台执行

image-20210801183957360

命令

# 后台执行保存操作bgsave

作用
手动启动后台保存操作,但不是立即执行

bgsave执行原理

image-20210801184557738

image-20210801184640289

save配置

在配置文件配置就会自动进行保存

save second changes

image-20210801190323971

原理

image-20210801191036171

三种方式对比

save配置就是bgsave

image-20210801191627188

rdb特殊启动方式

image-20210801191806998

优点和缺点

image-20210801194234783

AOF

RDB的弊端

image-20210801195359162

AOF概念

  • AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令
    达到恢复数据的目的。与RDB相比可以简单描述为改记录数据为记录数据产生的过程
  • AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式

AOF写入过程

image-20210801195843107

AOF写数据三种策略(appendfsync)

  • always(每次)
    每次写入操作均同步到AOF文件中,数据零误差,性能较低,不建议使用
  • everysec(每秒)
    每秒将缓冲区中的指令同步到AOF文件中,数据准确性较高,性能较高,建议使用,也是默认控制
    在系统突然宕机的情况下丢失1秒内的数据
  • no(系统控制)
    由操作系统控制每次同步到AOF文件的周期,整体过程不可控,不建议使用

AOF功能开启

  • 配置

    appendonly yes|no
    

    作用
    是否开启AOF持久化功能,默认为不开启状态

  • 配置

    appendfsync always|everysec|no
    

    作用
    AOF写数据策略

  • 配置

    appendfilename xx.aof
    

    作用

    指定生成的文件名

image-20210801200851543

AOF写数据遇到的问题

image-20210801201102676

只有最后一个命令才会形成最终的数据,造成冗余

image-20210801201238986

image-20210801201339440

重写方式

# 手动重写bgrewriteaof# 自动重写auto-aof-rewrite-min-size sizeauto-aof-rewrite-percentage percentage

image-20210801203848744

image-20210801204257923

AOF重写流程

image-20210801204840585

image-20210801205052046

RDB与AOF的去区别

image-20210802123236174

image-20210802123641174

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值