1. Redis

Redis 是用C语言开发的一个开源的高性能键值对数据库

特征:

  1. 数据间没有必然的关联关系
  2. 内部采用单线程机制进行工作
  3. 高性能
  4. 多数据类型支持
    • 字符串类型 string
    • 列表类型 list
    • 双列类型 hash
    • 集合类型 set
    • 有序集合类型 zset/sorted_set
  5. 支持持久化, 可以进行数据灾难恢复

2. 安装

  1. wget https://download.redis.io/releases/redis-6.2.5.tar.gz
  2. tar -xvf redis-6.2.5.tar.gz
  3. cd redis-6.2.5
  4. make
  5. make install
  6. redis-server
  7. # redis-server --port 6380 指定端口 默认为6379
  8. #客户端
  9. redis-cli
  10. # redis-cli -p 6380
  11. #创建存放配置和数据目录
  12. mkdir conf
  13. mkdir data
  14. cp redis.conf ./conf
  15. firewall-cmd --zone=public --add-port=6379/tcp --permanent

3. 配置文件

redis.conf

  1. bind 192.168.130.128 #绑定对外访问的ip 建议为本机ip 也可注释掉任何主机都可访问
  2. protected-mode no #关闭主机保护模式 yes为开启
  3. requirepass 123456 #设置密码
  4. port 6379
  5. timeout 0 #客户端闲置等待时间 到时间关闭
  6. daemonize yes #后台运行
  7. logfile "log-6379.log" #日志文件名
  8. dir root/redis-6.2.5/data
  9. maxclients 0 #服务器允许最大连接数 默认为0无限
  10. loglevel verbose #debug verbose notice waring 四个级别 开发期间为verbose 生产环境配置为notice 降低写日志IO的频度
  11. redis-server /root/redis-6.2.5/conf/redis.conf
  12. auth 123456
  1. #连接
  2. redis-cli
  3. auth 12

4. 数据类型指令

02. Redis - 图1

redis 自身是一个 MAP 所有的数据类型都是 键值对形式存储

而数据类型指的value部分的类型 key永远是字符串

4.1. String

一个存储空间保存一个数据

如果是数字也可以作为数字操作

  • set key value 添加/修改数据
  • get key 获取数据
  • del key 删除数据
  • setnx key value 判断性添加数据
  • mset key1 value1 key2 value2 … m是Multiple缩写
  • mget key1 key2 … 获取多个数据
  • strlen key 获取数据字符长度
  • append key value 追加信息到原始信息后面 (如存在则追加 否则新建)

  • incr key 设置数值+1 如果key不存在 则从0开始并新建 只有数字字符串可以
  • incrby key increment 设置数值+n
  • incrbyfloat key increment 设置小数增加+n
  • decr key 设置数值-1
  • decrby key increment 设置数值减少指定范围
  • setex key seconds value 设置数值具有指定的生命周期秒 如:setex next 10 hello
  • psetex key milliseconds value 设置数值具有指定的生命周期毫秒

注意事项:

  1. (integer)0 为false 1为成功 也可能为运行的结果值
  2. 数据为获取到是 对应为(nil) === null
  3. 数据最大的存储量为 512MB
  4. string在内部存储就是一个字符串 当遇到增减类操作 incr,decr时会转成数值类型进行计算
  5. 在操作数值时,如果原始数据不能转成数值或超出了redis数值的范围 将报错 java.long的MAX_VALUE
  6. redis所有操作都是原子性,采用单线程处理所有业务,命令都是一个一个执行的,因此无需考虑并发带来的数据影响

02. Redis - 图2

4.2. hash

一个存储空间保存多个键值对数据 hash空间里面的key我们通常称为field

如果field数比较少,存储结构会优化为数组,较多时为HashMap结构

  • hset key field value 添加/修改数据
  • hget key field 获取数据
  • hgetall key 获取整个hash
  • hdel key field1 [field] 删除hash指定的field
  • hsetnx key field value 设置field, 如果field存在则不做任何操作
  • hmset key field1 value1 field2 value2 设置多个filed
  • hmget key field1 field2 获取多个数据
  • hlen key 获取哈希表中field的数量
  • hexists key field 判断哈希表是否存在指定的field

  • hkeys key 获取哈希所有的字段名
  • hvals key 获取哈希所有的字段值
  • hincrby key field increment 设置指定字段的数值增加指定范围 可以为负数
  • hincrbyfloat key field increment 设置指定字段的数值增加指定小数范围

注意事项:

  1. hash类型中的value只能存储字符串 不允许其他数据类型
  2. 每个hash可以存储 2的32次方-1个键值对
  3. hash设计初衷不是为了存储大量对象而设计的 不可以将hash转为对象列表使用
  4. hgetall 操作可以获取全部属性 如果男人field过多 遍历整体数效率就会很低 造成数据访问瓶颈

4.3. list

一个存储空间保存多个数据 并且根据存储顺序一致 底层使用了双向链表存储结构实现

  • lpush key value1 [value2] … 从左添加/删除数据 可以存储多个值
  • rpush key value1 [value2] … 从右添加/删除数据
  • lrange key start stop 获取指定范围的数据 下标从0开 -1为最后一个元素或list长度-1
  • lindex key index 获取索引的数据 如索引越界则查询为nil
  • llen key 获取list长度
  • lpop key 从左获取并移除数据
  • rpop key 从右获取并移除数据

  • lrem key count value 移除指定个数的指定数据 如删除个数超出总个数 则删除全部指定数据
  • blpop key1 [key2] timeout 规定时间内获取并移除数据 秒单位 如果有多key则按顺序获取并移除 只有前面为nil后面的key才会执行 每次执行一次 是一个阻塞队列
  • brpop key1 [key2] timeout 规定时间内获取并移除数据
  • brpoppush source destination timeout 将a列表push到b列表中

注意事项:

  1. list数据都是string类型 最多2的32次方-1个元素
  2. list有索引的概念, 但操作数据通常以队列形式入队出队 或以栈的形式
  3. 获取全部数据的操作结束索引为-1
  4. list可以对数据进行分页操作 第一页数据来源list 而第二页后的通常以数据库形式加载

4.4. set

set与hash存储结构完全相同,但set只存储键,不存储值 值为nil 并且值是不允许重复的

  • sadd key member1 [member2] 添加数据
  • smembers key 获取全部数据
  • srem key member1 [member2] 删除指定数据
  • scard key 获取集合数据总量
  • sismember key member 判断集合中是否包含指定数据
  • srandmember key [count] 随机获取集合中指定数量的数据
  • spop key [count] 随机获取集合中的某个数据并移除出集合

  • sinter key1 [key2 …] 求两个集合的交集
  • sunion key1 [key2 …] 求两个集合的并集
  • sdiff key1 [key2 …] 求两个集合的差集
  • sinterstore destination key [key2 …] 求两个集合的交集并存储到指定集合中
  • sunionstore destination key [key2 …] 求两个集合的并集并存储到指定集合中
  • sdiffstore destination key [key2 …] 求两个集合的差集并存储到指定集合中
  • smove source destination member 将指定数据从A集合移动到B集合

注意事项:

  1. set不允许数据重复
  2. set虽然和hash的存储结构相同 , 但无法使用存储值的空间

5. 常用指令

5.1. key

  • del key 删除指定key
  • exists key 判断key是否存在
  • type key 获取key的类型
  • sort key 排序 默认对数字排序 如果要按自然排序则 需要指定 alpha 查询出来是排序 原数据不做改变 并且可以根据 ASC|DESC 指定升降序
  • rename key new key 重命名
  • renamenx key newkey 存在则修改 否则不做任何操作

  • expire key seconds 为指定key设置有效期 秒
  • pexpire key milliseconds 为指定key设置有效期 毫秒
  • expireat key timestamp 时间戳
  • pexpireat key milliseconds-timestamp 毫秒级时间戳
  • ttl key 获取key的有效时间 秒 -1为永久 -2为不存在
  • pttl key 获取key的有效时间 毫秒
  • persist key 将此key转为永久性
  • keys pattern 表达式查询
    • 02. Redis - 图3

5.2. db

rdis服务器默认提供16个数据库 从0到15 默认为0 每个数据库之间的数据相互独立

  • select index 切换数据库
  • ping 测试与服务器是否连同 发送消息
  • move key db 数据移动
  • dbsize 当前数据库key总量
  • flushdb 当前数据库清除
  • flushall 全部数据库清除