1. Redis
Redis 是用C语言开发的一个开源的高性能键值对数据库
特征:
- 数据间没有必然的关联关系
- 内部采用单线程机制进行工作
- 高性能
- 多数据类型支持
- 字符串类型 string
- 列表类型 list
- 双列类型 hash
- 集合类型 set
- 有序集合类型 zset/sorted_set
- 支持持久化, 可以进行数据灾难恢复
2. 安装
wget https://download.redis.io/releases/redis-6.2.5.tar.gz
tar -xvf redis-6.2.5.tar.gz
cd redis-6.2.5
make
make install
redis-server
# redis-server --port 6380 指定端口 默认为6379
#客户端
redis-cli
# redis-cli -p 6380
#创建存放配置和数据目录
mkdir conf
mkdir data
cp redis.conf ./conf
firewall-cmd --zone=public --add-port=6379/tcp --permanent
3. 配置文件
redis.conf
bind 192.168.130.128 #绑定对外访问的ip 建议为本机ip 也可注释掉任何主机都可访问
protected-mode no #关闭主机保护模式 yes为开启
requirepass 123456 #设置密码
port 6379
timeout 0 #客户端闲置等待时间 到时间关闭
daemonize yes #后台运行
logfile "log-6379.log" #日志文件名
dir root/redis-6.2.5/data
maxclients 0 #服务器允许最大连接数 默认为0无限
loglevel verbose #debug verbose notice waring 四个级别 开发期间为verbose 生产环境配置为notice 降低写日志IO的频度
redis-server /root/redis-6.2.5/conf/redis.conf
auth 123456
#连接
redis-cli
auth 12
4. 数据类型指令
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 设置数值具有指定的生命周期毫秒
注意事项:
- (integer)0 为false 1为成功 也可能为运行的结果值
- 数据为获取到是 对应为(nil) === null
- 数据最大的存储量为 512MB
- string在内部存储就是一个字符串 当遇到增减类操作 incr,decr时会转成数值类型进行计算
- 在操作数值时,如果原始数据不能转成数值或超出了redis数值的范围 将报错 java.long的MAX_VALUE
- redis所有操作都是原子性,采用单线程处理所有业务,命令都是一个一个执行的,因此无需考虑并发带来的数据影响
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 设置指定字段的数值增加指定小数范围
注意事项:
- hash类型中的value只能存储字符串 不允许其他数据类型
- 每个hash可以存储 2的32次方-1个键值对
- hash设计初衷不是为了存储大量对象而设计的 不可以将hash转为对象列表使用
- 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列表中
注意事项:
- list数据都是string类型 最多2的32次方-1个元素
- list有索引的概念, 但操作数据通常以队列形式入队出队 或以栈的形式
- 获取全部数据的操作结束索引为-1
- 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集合
注意事项:
- set不允许数据重复
- 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 表达式查询
5.2. db
rdis服务器默认提供16个数据库 从0到15 默认为0 每个数据库之间的数据相互独立
- select index 切换数据库
- ping 测试与服务器是否连同 发送消息
- move key db 数据移动
- dbsize 当前数据库key总量
- flushdb 当前数据库清除
- flushall 全部数据库清除