redis

一. 基本数据类型

String(字符串)

string是redis最基本的类型,一个key对应一个value。
string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
string类型是Redis最基本的数据类型,一个键最大能存储512MB。
SET key value
GET key

Redis 集合(Set)

Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
SADD key value
SMEMBERS key

Redis 有序集合(sorted set)

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
ZADD key score value
ZRANGE key start stop WITHSCORES

Redis 列表(List)

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
LPUSH key value
LRANGE key start stop

Redis 哈希(Hash)

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
HMSET key filed1 value1 filed2 value2
HGETALL key

二. 保证操作的原子性

watch机制(无法保证原子性)

127.0.0.1:6379[1]> MULTI
OK
127.0.0.1:6379[1]> set key 1
QUEUED
127.0.0.1:6379[1]> set key2 nn
QUEUED
127.0.0.1:6379[1]> INCR key2
QUEUED
127.0.0.1:6379[1]> EXEC
1) OK
2) OK
3) (error) ERR value is not an integer or out of range

命令 “INCR key2” 把字符串自增,被成功加入队列,但是最后执行的时候报错,然而前两个命令成功执行了,所以没有保证原子性。

lua脚本

Lua 嵌入 Redis 优势:
减少网络开销: 不使用 Lua 的代码需要向 Redis 发送多次请求, 而脚本只需一次即可, 减少网络传输;
原子操作: Redis 服务器会单线程原子性执行 lua 脚本,保证 lua 脚本在处理的过程中不会被任意其它请求打断;
复用: 脚本会永久保存 Redis 中, 其他客户端可继续使用.
eg:通过脚本实现自乘运算

local curVal = redis.call("get", KEYS[1])
if curVal == false then
  curVal = 0
else
  curVal = tonumber(curVal)
end
curVal = curVal * tonumber(ARGV[1])
redis.call("set", KEYS[1], curVal)
return curVal
script load 'local curVal = redis.call("get", KEYS[1]); if curVal == false then curVal = 0 else curVal = tonumber(curVal) end; curVal = curVal * tonumber(ARGV[1]); redis.call("set", KEYS[1], curVal); return curVal'
be4f93d8a5379e5e5b768a74e77c8a4eb0434441
evalsha be4f93d8a5379e5e5b768a74e77c8a4eb0434441 1 foo 5

三.Spring redis cache

1.配置RedisCacheManager

设置缓存的名称是否作为key的前缀
设置key的失效时间

2. @Cacheable、@CachePut、@CacheEvict 注释介绍

@Cacheable 的作用:主要针对方法配置,能够根据方法的请求参数对其结果进行缓存

表 1. @Cacheable 作用和配置方法

@Cacheable 主要的参数 说明 举例
value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 @Cacheable(value=”mycache”) 或者 @Cacheable(value={”cache1”,”cache2”}
key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 @Cacheable(value=”testcache”,key=”#userName”)
condition 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 @Cacheable(value=”testcache”,condition=”#userName.length()>2”)

@CachePut 的作用:主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用

表 2. @CachePut 作用和配置方法

@CachePut 参数说明 说明 举例
value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 @Cacheable(value=”mycache”) 或者 @Cacheable(value{”cache1”,”cache2”}
key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 @Cacheable(value=”testcache”,key=”#userName”)
condition 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 @Cacheable(value=”testcache”,condition=”#userName.length()>2”)

@CachEvict 的作用:主要针对方法配置,能够根据一定的条件对缓存进行清空

表 3. @CacheEvict 作用和配置方法

@CacheEvict主要的参数 说明 举例
value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 @CachEvict(value=”mycache”) 或者 @CachEvict(value={”cache1”,”cache2”}
key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 @CachEvict(value=”testcache”,key=”#userName”)
condition 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才清空缓存 @CachEvict(value=”testcache”,condition=”#userName.length()>2”)
allEntries 是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存 @CachEvict(value=”testcache”,allEntries=true)
beforeInvocation 是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存 @CachEvict(value=”testcache”,beforeInvocation=true)

三.缓存key的生成策略问题

1. If no params are given, return SimpleKey.EMPTY.

2. If only one param is given, return that instance.

3. If more the one param is given, return a SimpleKey containing all parameters.

问题1.如果redisTemplate设置了template.setKeySerializer(new StringRedisSerializer()),会出现key的类型转换异常
问题2.不同包下的方法参数相同时,key冲突
解决:重写keyGenerator()

四.redis集群搭建

集群模式下,redis各个节点通过请求转发,找到真正的槽

五.实现分布式锁

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容