redis学习笔记

Redis学习笔记

Part 1 Mysql VS Nosql

时间戳 当前距离1970年1月1日8时0分0秒 的总秒数 计算机纪元

1971年 贝尔实验室的程序员 发明了unix系统和c语言 (jvm底层语言)
计算机都是32位的 时间跨度支持68年上下 1901—2038年范围内
随着64位系统的诞生 问题就解决了 2900多亿年

关系型数据库 E-R模型 (公司成员系统)

示例:

名字所在部门职位特征
阿拓教学部老师
爱德华清洁部扫地僧

设计:表members

字段名类型(大小)备注
namevarchar(255)名字
departmentvarchar部门
titlevarchar职位

非关系型数据库 (json类型)

行1 : {“name”:“爱德华”,“department”:“清洁部”,“title”:“扫地僧”}

行2 : {“name”:“阿拓”,“department”:“教学部”,“title”:“老师”,“特征”:“老”}

Part 2 Redis入门

Redis : REmote DIctionary Server 远程字典服务

RDS: Relational Database Service 关系型数据服务

一、linux命令

1)ifconfig 查看ip地址,查找inet后面对应的ip地址
是secureCRT客户端 连接虚拟机地址使用的

2)ll 查看当前目录下的所有文件

3)cd = change directory 进入指定目录
cd ~ 返回初始目录
cd redis-5.0.6 是redis的安装包目录

4)vim redis.conf 是打开当前的文件
可以通过上下键移动光标
输入:q 退出打开的状态 回到文件显示的窗口

二、redis命令
redis启动相关命令

1) redis-server 启动服务端的命令,但是需要保持当前窗口状态。
打开新的窗口,使用clone session方法。

2) redis-cli -p 6379 启动客户端的命令,需要通过参数-p 指定端口号
输入ping 会返回pong 代表连接ok

3) set key1 “hello world” 设置key1的值为“hello world” 返回ok。

4) get key1 返回“hello world” ,说明数据可以正常的存取。

5) exit 退出当前的连接

6) shutdown 关闭当前的服务 然后再执行一次exit完全退出

7) redis-benchmark 压测命令
测试在不同命令下 10w次请求在多长时间内完成
官方标准是达到10w/s 的get/set

redis数据库相关命令

1) keys * 查看当前数据库所有的key值
系统会设置3个默认key额外使用

2) keys ? 匹配方式的使用
对于存在key1 key2 key3形式的key时
keys key? 可以找到
keys k??? 也可以找到
说明?是一个匹配符,并且有占位的作用

3) select 1 切换到1号数据库
get key1 返回nil,空的意思
通过127.0.0.1:6379[?]后面的括号中的值,可以判断当前所在的数据库编号

4) dbsize 展示数据库中key的个数

5) flushdb 删除当前数据库的数据 “慎用!”

6) flushall 删除所有数据库的数据 要怎么用 看着办

​ get key1 返回nil,空的意思

如图:

在这里插入图片描述

redis键值操作命令

1) exists + key 判断键值是否存在

2) type + key 显示当前键值存储的数据类型

  1. expire + key + n 设置key值的有效时间为n秒 , 过了有效期,此key的值置为空
    pexpire + key + n 有效时间的单位变为毫秒。

4) ttl + key 还剩多长时间有效, 正数代表未过期的剩余时间,单位是秒。
pttl + key 返回剩余时间的单位变为毫秒。
负数的情况如下:
当返回-2时,说明key已经不存在
当返回-1时,说明key没有设置有效时间。

5) persist + key 设置数据一直有效,特别作用于错误设置了有效期之后。

6)del + key 删除一个key

  1. rename + key + newKey 可以重命名key的值

8)randomkey 随机出一个key

9) move key + dbID 移动指定key到另一个数据库中,dbID是数据库编号
eg: move key5 1

如图:

在这里插入图片描述

redis配置:

1) databases 16
默认是16个数据库,标号是0-15,默认进入的是0号数据库,可以通过select切换不同的库。

Part 3 Redis数据类型

一、String(字符串)

1 命令:

1)strlen 查看字符串的长度
2)append 增加后缀,返回字符串的长度
eg: append key1 “222” -> “hello111222”
eg: set key1 “hello111222”
3) 当value的值是整数时,可以通过命令直接进行数学运算
incr 自增 ,返回最新的值。
decr 自减, 也返回最新的值。
incrby 增加,区别是增加计算的参数 如:incrby key11 3。
decrby 减少,同上。

4) 范围内操作的命令
getrange key start end 获取从初始位置到结束位置的值,从0计数 ==》 类似subString
setrange key start newStr 设置从起始位置开始,替换指定位置为新的字符串
eg : “hello111222” -> setrange key1 5 333 -> “hello333222”

  1. 整合命令
    setex = set + expire 使用方式: setex + key + 时间 + value
    setnx = set + exists = set if not exists 使用方式: setnx + key + value
    如果key不存在,则设置数据,返回1。如果存在,不设置,返回0。
    getset 先取出原来的值,再设置为新值 使用方式: getset + key + value 返回旧值。

6) 批量操作
mget = more get 使用方式 : mget + key1 + key2 + key3
参数接收多个key, 结果返回多个value
mset = more set 使用方式:mset + key1 + value1 + key2 + value2
一次设置多个key和value, 参数本身是个map
msetnx 使用方式同上。

如图:

在这里插入图片描述

2 原理:

redis的字符串是动态字符串,内部结构类似ArrayList。采用预分配冗余空间的方式减少内存的频繁分配。内部为字符串分配的实际空间一般高于字符串长度,当字符串长度<1MB时,扩容方式是直接加倍,如果>1MB,一次扩容只扩1MB,直到扩大到512MB。

二、list(列表)

栈和队列 -》 “数据结构”
栈: 像生活中的口袋一样,后进先出。 push 压栈 pop 弹出
队列:像生活中的排队一样,先进先出。

1 命令:

1)存取操作 push pop range
lpush : 从左侧存入数据 —》 栈结构 弹出时执行lpop (从左侧弹出)
rpush: 从右侧存入数据 —》 队列结构 弹出时执行lpop (从左侧弹出)
lrange: 范围内查看数据 使用方式:lrange key start end

在这里插入图片描述

2)对list本身的操作
llen 查看长度
lindex 获取某一个位置的值,下角标从0开始
lrem 删除n个value的值 使用方式: lrem key N value
ltrim 截取某个范围的数据重新赋值给key 使用方式: ltrim key start end (下角标从0开始)
linsert 插入数据到某个位置的前后
使用方式: linsert key before/after oldValue newValue
如果要插入数据到头部,还可以使用 lpushx, 使用方式:lpushx key value
同理,如果要插入数据到尾部,可以使用 rpushx, 使用方式同上。
lset 可以更改指定位置的值 使用方式: lset key index value

三、Hash(哈希)

HashMap<String,String> ==》 string

HashMap<String,List> ==》 List

HashMap<String,Map> ==》 Hash

HashMap<String,Set<String>> ==》 Set

HashMap<String,Set<Double,String>> ==》 ZSet

1 命令:
1) 存取数据
hset 使用方式: hset hash1 key1 value1
hget 使用方式: hget hash1 key1 => “value1”
hsetnx 如果不存在即set新的key值
hmset/hmget 批量处理更便捷
在这里插入图片描述

​ 2) 遍历数据
​ hkeys 查看所有的key值
​ hvals 查看所有的value值
​ hlen 查看数据长度
​ hgetall 返回全部的key和value
​ hexists 判断是否存在某个key, 存在返回1,不存在返回0

​ 3) 变更数据
​ hdel 删除数据 , 使用方式 hdel key field_key
​ hincrby 对整数的增加操作,指定增加的范围 使用方式 hincrby key field_key num

四、set(集合)

java的集合中有list/set/map
list可以存储有序的重复数据, 而set可以存储无序的不重复数据。

1 命令:

1)读写操作:
sadd 创建set类型的value,eg: sadd set1 1 2 3 4 4 3 2 1
scard key 查看set的大小
smembers key 查询set中的所有值
sismember key value 判断value是否在key所对应的set中,
如果在返回1,如果不在返回0

2)更新操作:
srem key value1 value2 删除set中一至多个数据的值
srandmember key num 可以在set中随机出num个元素
spop key num 可以随机弹出num个元素返回

3) 交互操作:
smove key1 key2 value 移动元素value从key1到key2

在这里插入图片描述

​ 还支持求并集、交集和差集。
​ sinter key1 key2 代表求两个集合的交集(两者都有的元素)。
​ sdiff key1 key2 返回存在在key1中但不存在在key2中的元素,两者的差集
​ sunion key1 key2 返回并集(两个集合中的所有元素)

在这里插入图片描述

拓展问题: 在java的set中,如何求交集、差集、并集?
方法: retainAll()、removeAll()、addAll()

五、ZSet(有序集合)

1 命令
1)读取操作
zadd 创建或增加zset的元素值,每一个元素值都包含 <分数,value>
使用方式: zadd key1 score1 value1 score2 value2 …
zrange key1 start end 指定在start到end的范围内查看元素
如果要查看分数 ,加上withscores
zrangebyscore key1 minScore maxScore 指定分数范围内查询元素
参数说明 分数前增加“(” 代表开区间(不包含当前值)
支持limit分页 limit + offset(偏移量) + num(返回的数量)
zrem key1 + value 删除指定的value值

在这里插入图片描述

2)统计操作
zcard + key 统计元素个数
zcount + key + minScore + maxScore 统计给定分数范围内的元素个数
比如统计及格人数等需求。
zscore + key + member 查询指定成员的分数
zrank + key + member 返回指定成员的索引位置(因为有序,所以位置代表排名)
zrevrank + key + member 默认从低到高排序,逆序正好代表排名
zrevrange 原来是从小到大排列,逆序后从大到小排列

在这里插入图片描述

六、Geo(位置信息)

1 命令
1) geoadd + key + 经度 + 维度 + 成员名
通过经纬度存储地址,支持存储多个

​ 2) geodist + key + member1 + member2 + 距离单位
​ 查询两个地点之间的相对距离
​ 距离单位支持:m(米)、km(千米)、mi(英里)、ft(英尺)
​ 3)geopos 查询成员经纬度数据
​ 4)geohash 进行哈希编码 ,得到编码结果

在这里插入图片描述

​ 5)georadius 以某个经纬度的位置为中心,划一个指定距离的半径,返回集合中满足条件的地址。 这就是“附近的XXX”的一种实现方式。
​ 使用方式: georadius + key + 中心的经度 + 中心的纬度 + 半径的距离 + 半径的单位
​ 可选参数: withdist 返回距离; withcoord 返回经纬度 ; withhash 返回哈希编码;

在这里插入图片描述

七、bitmap(位图)

命令

1)读取操作
setbit key index 0/1 设置某个位置的值为 0 / 1
getbit key index 获取某个位置的值
get + key 零存整取,直接获得二进制字符数组对应的字符串。

​ 2) 统计操作
​ bitcount 查询数组中有多少个1
​ 支持参数 字符的起始位置到终止位置 , 可以计算每个字符的二进制有多少个1

在这里插入图片描述

八、HyperLogLog(基数统计)

命令

​ 1) 基础命令
​ pfadd 增加数据
​ pfcount 统计数据 (去重)

在这里插入图片描述

九、Stream(流)

1 消息的发布与订阅

在这里插入图片描述

​ 上图的出处: https://www.cnblogs.com/lovesong/p/5272752.html

命令:

​ subscribe + channel 订阅频道的命令,会持续接收消息
​ publish + channel + message 在某个频道发布消息,相应的订阅者会接收到

2 Stream
生成消息的命令:

​ 1) xadd 生成消息,返回消息ID(时间戳+顺序),顺序指的该毫秒下产生的第几条消息。
​ 2)xlen 查看消息列表的长度
​ 3)xrange key - + 遍历所有的消息
​ 4)xdel key + 消息ID 通过消息id删除消息

在这里插入图片描述

​ 读取消息的命令:
​ 1)xread 读取消息,返回消息列表
​ eg: xread + streams + key + 0-0 遍历读取所有的消息
​ 支持参数count + num,指定返回消息的数量
​ 支持参数block + num, 可以阻塞等待消息的返回,此时0-0 应该替换为“$”,代表从尾部接收

在这里插入图片描述

在这里插入图片描述

part 4 Redis配置文件

  • linux命令

1 cd: 更改目录
cd ~ 回到初始目录
cd … 回到上级目录
2 mkdir 创建目录 eg: mkdir myredis
3 cp 拷贝文件
eg: cp redis-5.0.6/redis.conf myredis/
4 ll 查看目录内的文件
5 vim 文本编辑器
两种模式: 命令模式 、 编辑模式
打开文件时,默认是命令模式,可以查看文件的内容。
输入i(insert),可以切换为编辑模式,此时才可以更改文件。
按ESC,可以从编辑模式再切换为命令模式 (此时才可以退出)。

​ 退出方式,输入 : q (如果文件被修改,会提醒未保存)
​ 不保存,输入 : q!
​ 保存,输入 : wq

redis.conf

1 单位的问题: 1k / 1kb / 1m / 1mb / 1g / 1gb 是不同的,没有b的时候取整。
单位的大小写是不敏感的 1GB=1gB=1Gb

网络相关

2 bind 127.0.0.1 绑定ip地址(能够访问服务端的地址)
当前的redis服务只能被本机访问
3 protect-mode yes 开启保护模式
当bind没有配置且登录不需要密码时,启动保护模式(只能被本地访问)
4 port 6379 端口号

5 timeout 0 客户端超时时间 ,0代表一直保持

6 tcp-keepalive 300 单位是秒,每300s去检查一次客户端是否健康,避免服务端阻塞。

7 tcp-backlog 511 队列数量(未完成握手和已完成握手的)

通用相关

8 daemonize no 后台运行开关
改为yes后,重启redis验证。
redis启动指定配置文件的方式为: redis-server /root/myredis/redis.conf

9 pidfile /var/run/redis_6379.pid 当守护进程开启时,写入进程id的文件地址

10 loglevel notice 四种级别,notice对应生产环境

11 logfile “” 日志存储的位置

12 databases 16 初始化数据库是16个

  • 安全和限制

    config命令是一种从客户端查看配置项信息的方式,使用config get
    属于危险命令,可以限制使用。

    安全校验配置 requirepass 代表是否设置密码
    如果需要设置密码 config set requirepass + <password>
    此时输入命令前,需要先校验 anth + <password> 然后才能执行其他操作
    恢复初始状态,只需要重新设置为空串
    在这里插入图片描述

    危险命令限制
    包含 config / flushdb / flushall / keys
    rename-command + 命令 + “” 将此命令置为不可用

    其他限制
    maxclients 10000 客户端并发数的限制
    maxmemory 最大内存
    maxmemory-policy 缓存淘汰策略
    默认值 noeviction (不删除只报错)
    其他策略主要分为两种情况
    allkeys(所有的键值都可能删除) volatile(只删除设置了过期时间的键值)

part 5 Redis持久化

一. RDB :在指定的时间间隔内对数据进行快照存储。先将数据集写入临时文件,写入成功后,在替换之前的文件,用二进制压缩存储,是一次的全量备份

二. AOF :以日志文本的形式记录服务器所处理的每一个数据更改指令,然后通过重放来恢复数据,是连续的增量备份

RDB:

触发机制:

命令触发:

  1. save 会阻塞当前Redis服务器,直到持久化完成之后,线上禁止使用

  2. Bgsave 触发会fork一个子进程,由子进程负责持久化过程,因此阻塞只会发生在fork子进程的时候

自动触发:

  1. 根据配置文件的save m n自动触发(在m秒内写入n条 就触发)

  2. 从节点全量赋值时,主节点发送rdb文件给从节点完成复制操作,主节点会触发bgsave

  3. 执行debug reload时

  4. 执行shutdown时,如果没有开启aof,也会触发

优点

  1. 通过RDB文件恢复比较快

  2. RDB文件非常紧凑,适合数据备份。

  3. 通过RDB进行数据备份,由于使用子进程生成,所以对Redis服务器性能影响较小

缺点

  1. 采用RDB的方式可能会造成某个时段内数据的丢失,比如还没达到 触发条件时服务器死机了,那么这个时间段的数据会丢失。

  2. 使用save命令会造成服务器阻塞,直接数据同步完成才能接收后 续请求。

  3. 使用bgsave命令在forks子进程时,如果数据量太大,forks的过程也会发生阻塞,另外forks子进程会耗费内存。

AOF:

触发机制:

1.修改同步always:同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好

2.秒同步everysec:异步操作,每秒记录 如果一秒内宕机,有数据丢失

3. 从不同步

优点:

  1. AOF只是追加日志文件,因此对 服务器性能影响较小,速度比 RDB要快,消耗的内存较少。

  2. 数据安全性较高。

缺点 :

  1. AOF方式生成的日志文件太大,即使通过AFO重写,文件体积仍然很大。

  2. 恢复数据的速度比RDB慢

part 6 Redis事务

redis事务的本质:一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行。

redis事务没有隔离级别的概念

redis单条命令具有原子性,事务不具有原子性

redis事务:

  • 开启事务:multi

  • 命令入队:根据入队的顺序执行

  • 执行事务:exec

取消事务命令:DISCARD

  • 若在事务队列中存在命令性错误(类似于java编译性错误),则执行EXEC命令时,所有命令都不会执行
  • 若在事务队列中存在语法性错误(类似于java的1/0的运行时异常),则执行EXEC命令时,其他正确命令会被执行,错误命令抛出异常。

part 7 Redis过期策略

  • 定时删除在设置key过期时间时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除

  • 定期删除: 每隔一段时间执行一次删除过期key操作

  • 惰性删除:key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null

part 8 Redis内存淘汰策略

maxmemory-policy 缓存淘汰策略

默认值 noeviction (不删除只报错)

策略主要分为两种情况

allkeys(所有的键值都可能删除)

volatile(只删除设置了过期时间的键值)

  • noevition:不删除策略,达到最大内时,如果需要更大的内存 直接返回错误信息
  • allkeys-lru:所有的key通用,优先删除最少使用的key
  • volatitle-lru:优先删除设置了过期时间,最近使用最少的key
  • allkeys-random:所有的key通用,随机删除一部分key
  • volatile-random:随机删除一部分设置过期时间的key
  • volatile-ttl:优先删除剩余时间短的key

part 9 Redis主从复制

概念:

是指将一台在服务器的数据复制到别的redis服务器,数据的复制时单向的,只能从主节点到从节点,一个主节点可以由多个从节点,一个从节点只能由一个主节点**

作用:

  • 故障恢复:当主节点出现故障时,可以由从节点提供服务,实现快速故障恢复
  • 负载均衡:在主从复制的基础上,实现读写分离,分摊服务器的负载
  • 高可用:主从复制还是哨兵和集群的实施基础
每一台redis主机默认都是master,主机会自动把数据同步到从机中
info replication  查看当前Redis服务器的角色

SLAVEOF host(主机的端口ip) port(主机的端口号)   配置主从

​ 复制原理

从机启动成功,连接到主机后会发送一条(sync)同步命令

master接收到命令,启动后台存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕后,master将传送整个数据到slave,并完成一次完全同步。

全量复制:slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。

增量复制:master继续将新的收集到的命令依次传给slave,完成同步,但是只要是重新连接master,一次完全同步(全量复制)将被自动执行。

Redis 哨兵

概念:当主服务器中断服务后,可以将一个从服务器升级为主服务器,以便继续提供服务。

哨兵的作用就是监控Redis系统的运行状况。它的功能包括以下两个。

(1)监控主服务器和从服务器是否正常运行。

(2)主服务器出现故障时自动将从服务器转换为主服务器。

优点:哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。主从可以自动切换,系统更健壮,可用性更高。

缺点:Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。

part 10 Redis缓存击穿 穿透和雪崩

缓存雪崩: 大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、 压力骤增,引起雪崩。

解决方案:给缓存设置过期时间时加上一个随机值时间,使得每个key的过期时间分布开来, 不会集中在同一时刻失效。

缓存穿透: 访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉。

解决方案:
1、把无效的Key存进Redis中。如果Redis查不到数据,数据库也查不到,我们把这个Key值保存进Redis,设置value=“null”,下一次在查询时直接返回
2、采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的 key直接被过滤。

缓存击穿:有大并发集中对其进行访问,突然间这个Key失效了,导致大并发全部打在数据库上,导致数据库压力剧增。这种现象就叫做缓存击穿。

解决方案:
1、可以对热点的key可以设置永不过期的key。
2、使用互斥锁。如果缓存失效的情况,只有拿到锁才可以查询数据库,降低了在同一时刻打在数据库上的请求,防止数据库打死。当然这样会导致系统的性能变差。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值