redis

基础

数据库演进历史
mysql单库 -> Memcached(缓存)+MYSQL+垂直划分(读写分离<主从>) -> 分库分表+水平划分+MYSQL集群
数据量大 读写混合

Redis(remote dictionary server)
键值数据库(key,value可以是一个json字符串)
单线程,保证命令原子性 —高性能原因主要是基于内存,IO多路复用是次要
支持数据持久化(rdb aof)
支持主从集群–保证数据安全,从为数据备份 分片集群—分布式存储

generic

​ keys [pattern] Find all keys matching the given pattern
​ del [key…] 删除
​ exists [key] 是否存在
​ expire [key] [seconds] 设置过期时间 -1为永久有效
​ ttl [key] 查看剩余时间
​ flushall 清空所有库
​ fulshdb 清空当前库
​ type [key] 查看类型
​ rename key newkey

String

​ set key value 增加或修改
​ mset [key value …] 增加或修改多组
​ get key 获取
​ mget [key…] 获取多组
​ incr key key对应数字加1
​ incrby key value key对应数字加value
​ incrbyfloat key v key对应浮点数加v
​ setnx key value 新增(已经有不做操作) =set key value nx
​ setex key seconds value 指定过期时间的set == set key value ex seconds
​ append key “…” 在原本的value后面增加
​ getrange key start end ==substring [start,end]
​ setrange key offset “” replace
​ getset key value 先获取在修改值没有则为nil

Key 的层级

…:…:1

Hash类型 key-Map集合

​ Hset key field value(hset why:1 age 10)
​ hget key field
​ hmset
​ hmget
​ hdel key field 删除hash指定的key字段
​ hl en key 查看有多少个字段
​ hgetall key 类似于Java entrySet
​ hkeys key 获取所有field Java getKeys
​ hvals key 获取所有value getValues
​ hincrby key field value 一个hash类型字段值自增
​ hsetnx 添加

List类型 双端队列/链表

​ lpush key element[…] 左侧插入
​ lpop key 返回移除左侧第一个元素,没有就返回nil
​ rpush key element[…]
​ rpop key
​ lrange key start end 返回一段角标范围内的所有元素
​ ltrim key start end 截取下标,list改变为截取值
​ //blpop brpop 和上面类似都是没有元素时等待
​ lindex key index 获取list的index下标的值(起始为0)
​ lset key index item 在key下index下标存在时,更新下标值
​ linsert key after|before 原字段 value 在原字段前或后插入字段
​ rpoplpuch list1 list2 将list1中最右值插入list2最左边


Set 类似HashSet

​ sadd key member…
​ srem key member…
​ scard key 返回元素个数
​ smemvers key 返回key下set的所有元素
​ sismember key member 判断member是否在key中
​ sinter k1 k2
​ sdiff k1 k2
​ sunion k1 k2
​ srandmember key 随机抽取set中的一个值
​ spop key count 随机删除count个元素

SortedSet 需要一个score进行排序

​ zadd key [score member… ]
​ zrem key member…
​ zscore key member 获取score
​ zrank key member 获取指定元素排名
​ zcard key 获取元素个数
​ zcount key min max score在给定范围内的元素个数
​ zincrby key increment
​ zrangebyscore key min max [withscores] 从最小值到最大值排序
​ zrevrange key star end [withscores] 降序排列(ZREVRANGE salary 0 -1 withscores)排名

	127.0.0.1:6379> ZREVRANGE salary 0 3
		1) "zs"
		2) "xh"
		3) "zzz"
		127.0.0.1:6379> ZREVRANGE salary 0 2
		1) "zs"
		2) "xh"
		3) "zzz"
		127.0.0.1:6379> ZREVRANGE salary 0 1
		1) "zs"
		2) "xh"
		127.0.0.1:6379> ZREVRANGE salary 0 0
		1) "zs"

三种特殊类型 Geospatial Hyperloglog Bitmap

​ 见文档https://redis.io/docs/latest/commands/?group=bitmap
​ Geospatial 存储位置信息
​ Hyperloglog 以12k固定大小确定基数 可以统计唯一量
​ Bitmap 则可以做两种情况的东西,比如打卡之类

事务

redis 单条命令保持原子性 事务不保证原子性 事务没有隔离级别的概念
开启事务 multi
取消事务 discard
执行事务 exec
当语法错误时 类似java的编译时异常 都不执行
当有无法执行的命令时 类似java的运行时异常 执行没有错误的项 故redis事务不保证原子性

watch 可以实现乐观锁
	127.0.0.1:6379> set money 100
	OK
	127.0.0.1:6379> set out 0
	OK
	127.0.0.1:6379> watch money
	OK
	127.0.0.1:6379> MULTI
	OK
	127.0.0.1:6379(TX)> set money 10
	QUEUED
	127.0.0.1:6379(TX)> set out 10
	QUEUED
	127.0.0.1:6379(TX)> exec
	(nil)
	127.0.0.1:6379> unwatch
	OK
	127.0.0.1:6379> multi
	OK
	127.0.0.1:6379(TX)> INCRBY money -10
	QUEUED
	127.0.0.1:6379(TX)> INCRBY out 10
	QUEUED
	127.0.0.1:6379(TX)> EXEC
	1) (integer) 70
	2) (integer) 30
	127.0.0.1:6379>

对象处理

存对象一般使用Json,如果必须要直接存对象,对象的类需要实现序列化

@Test
    public void test() throws JsonProcessingException {
        User user = new User("www", 12);
        //String string = new ObjectMapper().writeValueAsString(user);
        template.opsForValue().set("user",user);
        System.out.println(template.opsForValue().get("user"));

    }

​​​​​​​​​​​​​​​​​​​​
在这里插入图片描述

进阶

配置文件解读

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

rdb(Redis DataBase)

rdb文件存放地址查看以及修改

配置文件中的./为运行redis的地址

config get dir
config set dir ...

触发机制

​ 1.save条件满足

​ 2.执行flushall

​ 3.退出redis

在这里插入图片描述

优点:

1.适合大规模数据恢复

2.适合对数据完整性不高的情况,原因为缺点1

缺点

需要一定时间间隔进行操作,如果宕机最后一次修改数据会丢失

创建子进程占用一定内存空间

AOF(Append Only File)

默认关闭

在这里插入图片描述

主从复制(伪集群)

cp redis.conf …

修改 port pidfile logfile rbdfilename

查看状态 info replication

在这里插入图片描述

配置集群 slaveof localhost 6379 仅为单次配置,需要修改配置文件

在这里插入图片描述
主机写,从机只读

手动修改从机为主机 slaveof no one

哨兵模式

主机故障了自动选举主机 ,主机重启只能当作从机

在这里插入图片描述

最基本配置

vim sentiel.conf

# sentiel monitor 被监控的名字 host port 票数(与选举有关)
sentinel monitor myredis 127.0.0.1 6379 1

一些常见问题的介绍

缓存穿透

redis中和RDB中都没有导致过量访问RDB

缓存击穿

redis中热点数据过期导致过量访问该数据的访问RDB

雪崩

故障了自动选举主机 ,主机重启只能当作从机

[外链图片转存中…(img-muzLzwpB-1722215064444)]

最基本配置

vim sentiel.conf

# sentiel monitor 被监控的名字 host port 票数(与选举有关)
sentinel monitor myredis 127.0.0.1 6379 1

一些常见问题的介绍

缓存穿透

redis中和RDB中都没有导致过量访问RDB

缓存击穿

redis中热点数据过期导致过量访问该数据的访问RDB

雪崩

大量数据短时间内一起过期

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值