Springboot-redis

Springboot-redis,第1张

Springboot-redis

redis
  • 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多路复用的
    • 缓存穿透
    • 缓存击穿
    • 缓存雪崩

nosql数据库概述

泛指非关系型数据库.

  • 不支持ACID
  • 不支持sql标准
  • 远超于sql的性能
centos8安装启动redis6
  1. 安装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
  1. 修改daemonize 为true, 支持后台启动
# 找到安装redis的redis.conf文件
daemonize no 改为yes
# 启动
$ redis-server /usr/local/redis/redis-6.2.4/redis.conf
  1. 远程访问
# 修改redis.conf
bind 改为主机ip
protected-mode 改为no
关闭防火墙
/usr/local/bin下的redis文件
  1. redis-benchmark

性能测试工具, 可以本机运行, 查看本机性能如何

  1. redis-check-aof

修复有问题的AOF文件

  1. redis-check-rdb

修复有问题的dump.rdb文件

  1. redis-sentinel

redis集群哨兵使用

  1. redis-cli

redis客户端

  1. redis-server

redis服务端

docker-compose安装
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: true
redis底层原理

单线程+多路IO复用

常用 *** 作 数据库
  1. 切换数据库

select 1

  1. 查看有多少key

dbsize

  1. 清空当前数据库

flushdb

  1. 清空所有数据库

flushall

key
  1. 查看数据库中所有key

keys *

  1. key是否存在

exists key [key…]

  1. key的类型

type key

  1. 删除key

del key [key…]
unlink key [key…] 这个redis会异步去删除, 不会马上删除, 非阻塞

  1. 设置key的过期时间

expire key time(秒)

  1. 查看key的过期时间

ttl key -2表示已经过期, -1表示永不过期

string类型

底层是一个动态可修改的字符串, 类似于java中的ArrayList, 扩容会扩容原来的两倍, 如果超过了1M, 每次扩容只会扩容1M, 最大512M.

  1. 添加键值对

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 设置值同时设置过期时间

  1. 获取值

get key
mget key1 key2 同时获取多个value
getrange key startIndex endIndex 截取value的子字符串
getset key value 设置新值同时返回旧值

  1. 追加值

append key value 会在原来已有的值后面追加字符串

  1. 获取字符串长度

strlen key

  1. 数字增减, 不存在的key默认当成0处理(单线程下都是原子性 *** 作)

incr key
incrby key increment 加多少
decr key
decrby key decrement 减多少

list列表

字符串列表, 可以按照插入顺序排序. 底层是一个quickList双向链表. 当元素比较少时, 使用连续的内存空间, 叫压缩列表zipList. 数据量比较多时, 才是一个quickList, 把多个压缩列表变成一个链表.

  1. 插入值

lpush/rpush key value1 value2 lpush从左边插入 rpush从右边插入
linsert key BEFORE/AFTER value newValue 在value前/后插入一个元素

  1. 查看值

lrange start end end=-1时表示最后一个元素的位置

  1. d出值

lpop/rpop key count 从左边/右边d出几个值, d出后的值再list中不再存在, 没有值, 这个列表也不存在了
rpoplpush sourcekey destkey 从sourcekey列表后面d出一个值, 放入destkey左边

  1. 根据下标获取元素

lindex key [index]

  1. 获取list长度

llen key

  1. 删除

lrem key count value 从value往后删除count个元素

  1. 替换元素

lset key index newValue 将index下标下的元素替换成newValue

set集合

自动排重, 无序, 每个元素叫成员member, 底层是字典, 是用hash表实现的.

  1. 添加成员

sadd key member1 member2…

  1. 取出成员

smembers key

  1. 判断value是否在key的set中

sismember key value

  1. 元素个数

scard key

  1. 删除元素

srem key value

  1. 随机从set中取出值

spop key [count] d出后从set中删除
srandmember key [count] 随机取count个值, 不会从set中删除.

  1. 将一个set中的值放入另外一个set中

smove sourcekey destkey value

  1. 交集

sinter key1 key2

  1. 并集

sunion key1 key2

  1. 差集

sdiff key1 key2

Hash

hash对应的数据结构有两种, ziplist和hashtable, 当field-value短且少的时候用ziplist, 否则使用hashtable.

  1. 设置值

hset key field value field2 value2
hmset key1 filed value… key2 field value 批量设置多个key
hsetnx key field value field不存在时才能设置成功

  1. 取值

hget key field

  1. 判断field是否在key中

hexists key field

  1. 列出所有的field

hkeys key

  1. 列出所有的value

hvals key

  1. 数字加减

hincrby key field increment

zset有序集合

每个成员都有一个评分, 用评分排序, 底层类似于java中的Map, Double就是分数, 又类似于TreeSet. 使用hash关联value和分数. 跳跃表: 给value排序, 获取分数氛围内的元素列表.
跳表, 以空间换时间, 分为多层, 分层查找

  1. 添加成员

zadd key score1 value1 score2 value2

  1. 获取成员

zrange/zrevrange key start end 后面加上WITHSCORES 返回值中可以加上分数
zrangebyscore/zrevrangebyscore key minscore maxscore 根据分数范围查询

  1. 分数加分

zincreby key increment value

  1. 删除元素

zrem key value

  1. 统计分数内的成员

zcount key minscore maxsocre

  1. 排名

zrank key value 从0开始

发布订阅
  1. 发布消息

publish channel message

  1. 订阅消息

subscribe channel

bitmaps

bit二进制 *** 作.

HyperLogLog Geospatial 整合springboot
  1. 引入依赖

    org.springframework.boot
    spring-boot-starter-data-redis


    org.apache.commons
    commons-pool2

  1. 配置文件
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乐观锁

watch key1 key2… 在执行multi之前执行, 先执行watch, 当有key被改动, 版本号不一致, 事务执行失败.

redis中事务的三个特性
  1. 每个指令单独的事务隔离
  2. 没有隔离级别
  3. 多个指令没有原子性.
RDB和AOF两种持久化 *** 作 RDB

默认开启
将内存中的数据直接写到磁盘上.
在指定的时间间隔内, 将内存数据的快照写入磁盘中, 恢复时将快照文件直接读入内存中.
适合大部分数据恢复, 不过可能有部分数据丢失.

AOF

追加方式存储到磁盘上. 默认不开启, RDB和AOP都开启, 会读取AOF的数据.

主从复制
  1. 读写分离
  2. 容灾
面试题 redis使用单线程, 为什么还那么快
  1. *** 作redis是在内存中 *** 作的, 减少了IO *** 作
  2. 单线程没有多线程上下文切换问题, 较少竞争条件.
  3. 非阻塞IO-IO多路复用
如何实现单线程IO多路复用的

参考别人的

缓存穿透

原因: 很多请求发送过来, 查不到数据, 结果都去持久化数据库如mysql中去查
解决方案:

  1. 缓存空值, 设置个很短的过期时间, 如5分钟
  2. 设置白名单
  3. 布隆过滤器
  4. 实时监控
缓存击穿

原因: 多个请求访问一个key, key过期, 导致都去数据库中查询了
解决方案:

  1. 热点数据
缓存雪崩

原因: 大量key过期
解决方案: 过期时间不要设置一样

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5138474.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存