编辑
2023-10-18
缓存中间件
0

五大数据类型的常用操作

string

shell
set key value # 添加键值对,命令不区分大小写,但是key区分大小写 get key # 获取key的值 mset k1 v1 k2 v2 k3 v3 .. # 设置多个kv mget k1 k2 k3 .. # 获取多个k的值 msetnx k1 v1 k2 v2 .. # 只有当k都不存在时,才设置多个kv值 incr key # 将key中存储的数值+1[具有原子性] decr key # 将key中存储的数值-1[具有原子性] incrby/decrby key 步长 # 将key中的增/减步长 strlen key # 获取k的值的长度 setnx k v # 只有key不存在时才设置kv值 set k v [EX seconds] [PX millisseconds] [NX|XX] # EX:key在多少秒之后会过期 PX:key在多少毫秒之后会过期 NX:当key不存在时,才会创建key,相当于setnx XX:当key存在时,覆盖key append k v # 在值的末尾追加 getrange k <起始位置><结束位置> # 获取范围内的值

hash

shell
hset key field value # 给key集合中field赋值 hget k field # 从k集合中field取值 hmset k1 f1 v1 f2 v2 .. # 批量设置hash值 hmget k f1 f2 .. # 批量获取hash值 hgetall k # 获取所有字段值 hlen k # 返回k内全部数量 hdel k # 删除key hexists k f # 查看hash表key中,给定的field是否存在 hkeys k # 列出hash中所有的field hvals k # 列出hash中所有的value

list

shell
lpush/rpush k1 v1 v2 v3 .. # 从左边或右边插入数据 lpop/rpop key # 从左边或右边pop出值[值pop键也会销毁] lrange k start stop # 按照索引下标获得元素 llen k # 获取k列表的长度 rpoplpus k1 k2 # 从k1列表右边取值插入到k2列表的左边 lrange k 0 -1 # 0表示左边第一个,-1表示右边第一个,0 -1取所有值

set

shell
sadd k1 v1 v2 .. # 将一个或多个member元素加入到集合key中,已经存在的member元素将被忽略 srem k v1 v2 .. # 删除集合中的某个元素 smembers k # 取出该集合的所有值 sismember k v # 判断集合k是否含有v值,有返回1无返回0 scard k # 返回该集合的元素个数 srandmember k n # 随机从集合中取出n个值,不会从集合中删除 spop k n # 随机从集合pop n个值,并删除 sinter k1 k2 # 返回两个集合的交集 sunion k1 k2 # 返回两个集合的并集 sdiff k1 k2 # 返回两个集合的差集

sortset(zset)

shell
zadd key score1 v1 score2 v2 ... # 将一个或者多个member元素及其score值加入到有序集key中 zrange k start stop [WITHSCORES] # 返回有序集k中,下标在start-stop之间的元素,带WITHSCORES,可以让分数一起和值返回到结果集 zscore key member # 获取元素的分数 zrem k v # 删除该集合下,指定值得元素 zrevrangebyscore key minmax [withscores][limit offest count] # 按降序排列 zincrby k increment v # 为元素的score加上增量 zcard key # 获取集合中元素的数量 zcount k min max # 统计该集合,分数区间内的元素个数 zrangebyscore key minmax [withscores][limit offest count] # 返回有序集k中,所有score值介于(等于)min和max之间的成员,按升序排列 zrank k v # 返回该值在集合中的排名,从0开始 zrevrank k v # 降序
编辑
2023-10-17
缓存中间件
0

1.1、对Redis单线程还是多线程的理解?

Redis在3.x版本中采用的是单线程架构,数据结构简单,能够避免锁的开销和上下文切换,并且可以有很高的QPS。

在4.x版本中,严格意义上讲已经不是单线程了。Redis负责处理客户端请求的线程是单线程的,但是也有多线程的应用,比如异步删除。

Redis 6.x版本中,使用了全新的多线程模型。因为Redis的瓶颈并不是COU消耗,而是在网络I/O模块和内存,所以再Redis 6.x中使用多线程来处理网络I/O部分,充分利用CPU资源,减少网络I/O阻塞带来的性能和可用性损耗。

关于6.x版本的多线程运用具体说明,一次Redis请求,要先建立连接,然后获取、解析操作命令,然后执行命令,最后将响应的结果写到socket上。在Redis的多线程模式下,获取、解析命令,和输出结果这两个过程,可以配置成多线程执行的,因为它们是主要得耗时点。对于命令的执行,是内存操作,依然使用单线程运行。所以Redis的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程顺序执行,保证线程安全,避免出现并发安全问题。

Redis 6.x多线程机制默认是关闭的,如果想要使用需要在redis.conf文件中完成响应配置:

1、将io-thread-do-reads配置为yes,表示启用多线程

2、设置线程个数io-threads,建议4核cpu线程数设置为2或者3,如果是8核设置为6,线程数最好

1.2、为什么Redis单线程也可以这么快?

1、基于内存操作,Redis的所有数据都存在内存中,因此所有的运算都是在内存级别的,性能很高。

2、数据结构简单,Redis的数据结构的查找和操作的大部分时间复杂度都是O(1)的。

3、多路复用和非阻塞I/O,Redis使用I/O多路复用功能监听多个socket客户端连接,这样就可以使用一个线程处理多个请求,减少线程切换带来的开销,同时也能避免I/O阻塞操作。

4、避免上下文切换,因为是单线程模型,因此避免了很多不必要的上下文切换和多线程竞争,省去了很多资源的消耗。

编辑
2023-10-09
编码规范
0

该文章已加密,点击 阅读全文 并输入密码后方可查看。

编辑
2023-08-22
后端技术
0

1、Predicate(断言型)

Predicate断言型函数式接口,接受一个输入参数,返回一个布尔值结果。通常用于对集合或流中的元素进行条件判断、筛选和过滤操作。Predicate接口定义了一个抽象方法:boolean test(T t);该方法接受一个泛型参数 T 的输入参数,并返回一个布尔值。当输入参数满足某个条件时,test()方法返回 true,否则返回 false。

编辑
2023-08-09
后端技术
0

一次项目依赖SpringBoot版本做升级后,接口返回响应头Content-Type的值由application/json;charset=UTF-8变成了application/json,导致前端展示出现乱码。

经过对Spring MVC源码一番研究后发现,请求完成输出结果时会使用消息转换器HttpMessageConverter转换数据。我们项目使用的是SpringBoot,MappingJackson2HttpMessageConverter是springboot中默认的Json消息转换器。

问题就出现在MappingJackson2HttpMessageConverter的父类AbstractJackson2HttpMessageConverter中,在Spring5.2以前的版本,AbstractJackson2HttpMessageConverter类中的DEFAULT_CHARSET属性会有一个默认值。