- nosql数据库概述
- centos8安装启动redis6
- /usr/local/bin下的redis文件
- docker-compose安装
- redis底层原理
- 常用 *** 作
- 数据库
- key
- string类型
- list列表
- set集合
- Hash
- zset有序集合
- 发布订阅
- bitmaps
- HyperLogLog
- Geospatial
- 整合springboot
- 事务
- Multi, exec, discard
- watch乐观锁
- redis中事务的三个特性
- RDB和AOF两种持久化 *** 作
- RDB
- AOF
- 主从复制
- 面试题
- redis使用单线程, 为什么还那么快
- 如何实现单线程IO多路复用的
- 缓存穿透
- 缓存击穿
- 缓存雪崩
泛指非关系型数据库.
- 不支持ACID
- 不支持sql标准
- 远超于sql的性能
- 安装C语言的编译环境, 编译安装
# 安装编译环境 $ yum -y install gcc automake autoconf libtool make # 解压redis安装包, 进入解压路径make编译/usr/local/redis/redis-6.2.4 $ make # 安装, 安装成功后会在/usr/local/bin下面生成redis的文件 $ make install
- 修改daemonize 为true, 支持后台启动
# 找到安装redis的redis.conf文件 daemonize no 改为yes # 启动 $ redis-server /usr/local/redis/redis-6.2.4/redis.conf
- 远程访问
# 修改redis.conf bind 改为主机ip protected-mode 改为no 关闭防火墙/usr/local/bin下的redis文件
- redis-benchmark
性能测试工具, 可以本机运行, 查看本机性能如何
- redis-check-aof
修复有问题的AOF文件
- redis-check-rdb
修复有问题的dump.rdb文件
- redis-sentinel
redis集群哨兵使用
- redis-cli
redis客户端
- redis-server
docker-compose安装redis服务端
version: '3' services: redis: image: redis:latest container_name: redis restart: always ports: - 6379:6379 networks: - mynetwork volumes: - ./redis.conf:/usr/local/etc/redis/redis.conf:rw - ./data:/data:rw command: /bin/bash -c "redis-server /usr/local/etc/redis/redis.conf " networks: mynetwork: external: trueredis底层原理
单线程+多路IO复用
常用 *** 作 数据库- 切换数据库
select 1
- 查看有多少key
dbsize
- 清空当前数据库
flushdb
- 清空所有数据库
keyflushall
- 查看数据库中所有key
keys *
- key是否存在
exists key [key…]
- key的类型
type key
- 删除key
del key [key…]
unlink key [key…] 这个redis会异步去删除, 不会马上删除, 非阻塞
- 设置key的过期时间
expire key time(秒)
- 查看key的过期时间
string类型ttl key -2表示已经过期, -1表示永不过期
底层是一个动态可修改的字符串, 类似于java中的ArrayList, 扩容会扩容原来的两倍, 如果超过了1M, 每次扩容只会扩容1M, 最大512M.
- 添加键值对
set key value 第二次设置同样的key会覆盖掉原来的值
setnx key value 只有不存在的key才能设置成功
mset(msetnx) key1 value1 key2 value2 同时设置多个key-value键值对, 原子性 *** 作
setrange key offset value 在offset位置插入value
setex key expire value 设置值同时设置过期时间
- 获取值
get key
mget key1 key2 同时获取多个value
getrange key startIndex endIndex 截取value的子字符串
getset key value 设置新值同时返回旧值
- 追加值
append key value 会在原来已有的值后面追加字符串
- 获取字符串长度
strlen key
- 数字增减, 不存在的key默认当成0处理(单线程下都是原子性 *** 作)
list列表incr key
incrby key increment 加多少
decr key
decrby key decrement 减多少
字符串列表, 可以按照插入顺序排序. 底层是一个quickList双向链表. 当元素比较少时, 使用连续的内存空间, 叫压缩列表zipList. 数据量比较多时, 才是一个quickList, 把多个压缩列表变成一个链表.
- 插入值
lpush/rpush key value1 value2 lpush从左边插入 rpush从右边插入
linsert key BEFORE/AFTER value newValue 在value前/后插入一个元素
- 查看值
lrange start end end=-1时表示最后一个元素的位置
- d出值
lpop/rpop key count 从左边/右边d出几个值, d出后的值再list中不再存在, 没有值, 这个列表也不存在了
rpoplpush sourcekey destkey 从sourcekey列表后面d出一个值, 放入destkey左边
- 根据下标获取元素
lindex key [index]
- 获取list长度
llen key
- 删除
lrem key count value 从value往后删除count个元素
- 替换元素
set集合lset key index newValue 将index下标下的元素替换成newValue
自动排重, 无序, 每个元素叫成员member, 底层是字典, 是用hash表实现的.
- 添加成员
sadd key member1 member2…
- 取出成员
smembers key
- 判断value是否在key的set中
sismember key value
- 元素个数
scard key
- 删除元素
srem key value
- 随机从set中取出值
spop key [count] d出后从set中删除
srandmember key [count] 随机取count个值, 不会从set中删除.
- 将一个set中的值放入另外一个set中
smove sourcekey destkey value
- 交集
sinter key1 key2
- 并集
sunion key1 key2
- 差集
Hashsdiff key1 key2
hash对应的数据结构有两种, ziplist和hashtable, 当field-value短且少的时候用ziplist, 否则使用hashtable.
- 设置值
hset key field value field2 value2
hmset key1 filed value… key2 field value 批量设置多个key
hsetnx key field value field不存在时才能设置成功
- 取值
hget key field
- 判断field是否在key中
hexists key field
- 列出所有的field
hkeys key
- 列出所有的value
hvals key
- 数字加减
zset有序集合hincrby key field increment
每个成员都有一个评分, 用评分排序, 底层类似于java中的Map
跳表, 以空间换时间, 分为多层, 分层查找
- 添加成员
zadd key score1 value1 score2 value2
- 获取成员
zrange/zrevrange key start end 后面加上WITHSCORES 返回值中可以加上分数
zrangebyscore/zrevrangebyscore key minscore maxscore 根据分数范围查询
- 分数加分
zincreby key increment value
- 删除元素
zrem key value
- 统计分数内的成员
zcount key minscore maxsocre
- 排名
发布订阅zrank key value 从0开始
- 发布消息
publish channel message
- 订阅消息
bitmapssubscribe channel
bit二进制 *** 作.
HyperLogLog Geospatial 整合springboot- 引入依赖
org.springframework.boot spring-boot-starter-data-redisorg.apache.commons commons-pool2
- 配置文件
spring: redis: host: 192.168.242.130 port: 3306 database: 0 timeout: 18000000 # 连接超时时间 lettuce: pool: # 连接池大小, 负数表示没有限制 max-active: 20 # 最大阻塞等待时间, -1表示没有限制 max-wait: -1 # 连接池中最大空闲连接 max-idle: 5 # 连接池中最小空闲连接 min-idle: 0事务
redis事务是一个单独的隔离 *** 作: 事务中所有的 *** 作都会序列化, 按顺序执行. 事务在执行的过程中, 不会被其他客户端发送过来的请求打断. redis的事务主要是串连多个命令防止别的命令插队.
Multi, exec, discard从输入Multi开始, 表示开启一个事务, 到exec命令开始执行事务.discard回滚Multi阶段, 放弃事务的执行.
exec阶段, 不是原子性, 可以有部分成功, 部分失败.
watch key1 key2… 在执行multi之前执行, 先执行watch, 当有key被改动, 版本号不一致, 事务执行失败.
redis中事务的三个特性- 每个指令单独的事务隔离
- 没有隔离级别
- 多个指令没有原子性.
默认开启
将内存中的数据直接写到磁盘上.
在指定的时间间隔内, 将内存数据的快照写入磁盘中, 恢复时将快照文件直接读入内存中.
适合大部分数据恢复, 不过可能有部分数据丢失.
追加方式存储到磁盘上. 默认不开启, RDB和AOP都开启, 会读取AOF的数据.
主从复制- 读写分离
- 容灾
- *** 作redis是在内存中 *** 作的, 减少了IO *** 作
- 单线程没有多线程上下文切换问题, 较少竞争条件.
- 非阻塞IO-IO多路复用
参考别人的
缓存穿透原因: 很多请求发送过来, 查不到数据, 结果都去持久化数据库如mysql中去查
解决方案:
- 缓存空值, 设置个很短的过期时间, 如5分钟
- 设置白名单
- 布隆过滤器
- 实时监控
原因: 多个请求访问一个key, key过期, 导致都去数据库中查询了
解决方案:
- 热点数据
原因: 大量key过期
解决方案: 过期时间不要设置一样
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)