红泥小火炉


Redis(上)

Nathaniel 2022-02-09 1100浏览 0条评论
首页/正文
分享到: / / / /

Redis(上)

数据类型

字符串

键为字符串形式,值可以为字符串,也可以为数值等类型,值最大不超过512M;
外在类型为string,底层类型可以分为raw,int,embstr三种类型;
如果值长度未超过44字节,则用embstr类型;超过则使用raw类型;
# 新增键值对
# ex(秒级)|px(毫秒级)可以设置键的过期时间,nx标识键不存在时可以添加,xx标识键存在时可以添加
set key value [ex seconds][px milliseconds][nx|xx]
setnx key value
setex key seconds value
# getset返回的值为该key原有的value值
getset key value
# 查询键
get key
# 批量新建键值对
mset key1 value1 key2 value2 ...
# 批量查询键
mget key1 key2 ...
# 自增/自减:适用于值为数值类型
incr/decr key 
# 按指定步长自增/自减
incrby/decrby key stepValue
# 字符串追加
append key value
# 字符串长度
strlen key
# 获取指定索引位置范围内的字符串
getrange key start end

哈希

哈希对应的value为键值对,不是单独的值;
哈希对应的内部编码有两种:ziplist和hashtable;
ziplist:当元素个数小于hash-max-ziplist-entries配置(默认512个)、且所有值都小于hash-max-ziplist-value配置(默认64 字节)时,使用ziplist作为内部实现,否则使用hashtable.
# 新增键值对(hset作用同hmset)
hset key filed1 value1 filed2 value2 ...
# 获取对应键下的filed值(只能获取到一个filed的值,获取多个filed的值需要使用hmget)
hget key filed
# 获取指定key下所有的filed的个数
hlen key
# 删除指定key下的指定filed
hdel key filed1 filed2
# 获取所有的filed
hkeys key
# 获取所有的filed对应的value
hvals key
# 判断filed是否存在
hexists key filed
# 获取所有的filed和value
hgetall key # 不建议使用
hscan key
# 自增filed(适用于filed的值为数值类型)
hincrby key filed
# 获取filed对应值得字符串长度
hstrlen key filed

列表

列表:元素有序可重复;
内部实现有三种:ziplist、linkedlist、quicklist;
ziplist:当列表的元素个数小于list-max-ziplist-entries配置 (默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时 (默认64字节),使用ziplist,否则使用linkedlist。
# 添加
lpush key value1 value2 ...
rpush key value1 value2 ...
linsert key brfore|after param value # 在param元素之前或之后插入value值的元素
# 查看
lrange key start end # 包含了end索引位置的元素
# 获取指定索引下标的元素
lindex key index
# 获取列表元素个数
llen key 
# 从列表左/右弹出元素
lpop/rpop key
# 删除指定元素
# count>0 左->右匹配,删除最多count个元素;
# count<0 右->左匹配,删除最多count个元素;
# count=0 删除所有能匹配到的元素;
lrem key count value 
# trim
ltrim key start end
# 修改指定索引位置的元素
lset key index newValue

集合

集合:元素无序且不可重复;
内部实现有两种方式:intset 和 hashtable
当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512个)时,使用intset来实现。
# 添加元素
sadd key value1 value2...
# 获取元素
smembers key
# 获取元素个数
scard key
# 判断元素是否属于集合
sismember key value
# 随机从集合中选择元素:srandmembers不会删除元素,spop会删除元素
srandmembers/spop key 
# 多个集合元素交集
sinter key1 key2 ...
# 多个集合元素的并集
sunion key1 key2 ...
# 多个集合元素的差集
sdiff key1 key2 ...
# 存储集合运算的结果
sinterstore result key1 key2 ...
sunionstore result key1 key2 ...
sdiffstore result key1 key2 ...

有序集合

有序集合:元素不可重复,元素可排序;
内部实现:ziplist和skiplist
当有序集合的元素个数小于zset-max-ziplist-entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节)时,使用ziplist;
# 添加元素
zadd key score1 value1 score2 value2 ...
# 获取所有元素个数
zcard key
# 获取某元素的分数
zscore key value
# 获取某元素排名
zrank/zrevrank key value
# 删除元素
zrem key value
# 获取指定范围内的元素
zrange key start end [withscores]
# 返回指定分数范围的元素
zrangebyscore/zrevrangebyscore key min max [withscores] [limit offset count]

无限制命令

# 查看所有的键名称:遍历所有的键
keys *
# 获取所有键的数量:不遍历所有的键
dbsize
# 判断键是否存在:可以同时判断多个键是否存在,返回存在的键的数量
exists key1 key2 ...
# 删除键:可以同时删除多个键,返回的是删除的键的数量
del key1 key2 ... 
# 给键设置过期时间:单位是秒,设置过期时间时,该键必须已经存在
expire key seconds
# 查询键剩余存在时间,返回-1标识键没有设置过期时间,返回-2标识键不存在
ttl key

客户端-Jedis

@Test
public void baseTest(){
   GenericObjectPoolConfig poolConfig = new ConnectionPoolConfig();
   poolConfig.setMaxTotal(GenericObjectPoolConfig.DEFAULT_MAX_TOTAL * 3);
   JedisPool jedisPool = new JedisPool(poolConfig, "192.168.80.82", 6379);
   Jedis jedis = null;
   try {
       jedis = jedisPool.getResource();
       String setInfo = jedis.set("u:1:name", "zmyx");
       System.out.println(setInfo);
       String key = "u:1:name";
       String script = "return redis.call('get',KEYS[1])";
       Object result = jedis.eval(script, 1, key); 
       System.out.println(result);
   } catch (Exception e) {
       e.printStackTrace();
   } finally {
       if (jedis != null) {
         jedis.close();
       }
   }
}

使用JedisPool可以减少客户端创建链接的开销,使用池化也可以保护相关资源。

GenericObjectPoolConfig类为连接池配置类,其中有很多可以设置连接池属性的参数,其父类BaseObjectPoolConfig中定义了很多属性;

// 默认最大连接数
public static final int DEFAULT_MAX_TOTAL = 8;
// 默认最大空闲连接数
public static final int DEFAULT_MAX_IDLE = 8;
// 默认最小空闲连接数
public static final int DEFAULT_MIN_IDLE = 0;

上述例子中只展示了set方法和使用简单lua脚本获取相关value的使用,其他API操作和对应的命令使用一致;

客户端协议-RESP(Redis序列化协议)

请求参数格式:

*<参数数量> CRLF
$<参数1的字节数量> CRLF
<参数1> CRLF

响应参数说明:

"+":状态回复
"-":错误回复
":":整数回复
"$":字符串回复
"*":多字符串回复

持久化

redis的持久化分为三种:RDB、AOF以及混合模式;

RDB

以快照的形式将数据写入磁盘;

可以手动触发,也可以自动触发;

手动触发使用save/bgsave命令:save命令会阻塞redis服务器,直到持久化完毕;bgsave会执行fork操作创建子进程来持久化,阻塞发生在fork阶段。

自动触发RDB的场景:

满足save相关配置;
从节点发生全量复制操作时,主节点自动触发;
redis重新加载时,也会自动触发;
执行shutdown命令时,也会自动触发。

AOF

以日志的形式记录命令,可以满足持久化下的实时性要求。

appendonly yes

AOF缓冲区同步文件策略,分为三种:

always:命令写入aof_buf之后,调用fsync将操作同步到AOF文件);

everysec:每一秒调用一次fsync进行同步;

no:由操作系统调用。

AOF重写机制:将数据转换为写命令同步到新的AOF文件的过程;

手动触发:bgrewriteaof
自动触发:由auto-aof-rewrite-min-size(触发重写时的文件最小大小,默认为64M);
        auto-aof-rewrite-percentage(当前aof文件大小和上次aof文件大小比值)
        参数决定;

恢复时默认优先加载AOF文件;

混合模式

最后修改:2022-02-09 21:45:38 © 著作权归作者所有
上一篇

评论列表

还没有人评论哦~赶快抢占沙发吧~