数据类型:
字符串(strings) :字符存储
- 存值:
set k v
、redisTemplate.opsForValue().set("k",v);
- 取值:
get k
、redisTemplate.opsForValue().get("k");
- 批量
mset k4 v4 k5 v6
、redisTemplate.opsForValue().multiSet(map);
- 递加:(数值型字符)
incr k
、redisTemplate.opsForValue().increment("k")
- 递减:
decr key
、redisTemplate.opsForValue().decrement("k")
- 不存在则设值:
setnx k v
、redisTemplate.opsForValue().setIfAbsent("k1",2,Duration.ofSeconds(30));
- 存在k,才设值:
redisTemplate.opsForValue().setIfPresent("k2",3);
- 设置key,并设置过期时间(秒):
setex k 10 1
- 设置key,过期时间:
expire key 30
、redisTemplate.expire("k2",Duration.ofSeconds(30));
- 查询key :
keys PATTERN,如 keys k*
、redisTemplate.keys("k*")
- 拼接value:
APPEND key value
、redisTemplate.opsForValue().append("a3", "b")
;返回拼接后字符长度
string- 位图(bitmap) :对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)
- 存储:
setbit key 1 1
、redisTemplate.opsForValue().setBit("key",1,true)
- 0 1 0 0 0 0 0 0 ;一个字符8字节,默认8个二进制位.
- 取值:
getbit key 1
、redisTemplate.opsForValue().getBit("key", 1)
- 统计:
bitcount key
、(long) redisTemplate.execute((RedisCallback) e -> e.bitCount(key.getBytes()))
- 场景:适用只有两种状态的业务统计
有场景,频繁调用命令时;
- 如,便利存储多个 key,值不同。
- 考虑使用 管道技术
SessionCallback<?> sessionCallback = new SessionCallback<Object>() {
@Override
public <K, V> Object execute(RedisOperations<K, V> operations) throws DataAccessException {
ListOperations<String, Object> opsForList = redisTemplate.opsForList();
opsForList.rightPushAll(key,o);
return null;
}
};
redisTemplate.executePipelined(sessionCallback);
散列(hash) : 对象存储
- 存值:
hmset 小树 age 10 sex 1
、redisTemplate.opsForHash().put("小树","age",10)
- 取值:
hmget 小树 age
、redisTemplate.opsForHash().get("小树", "age")
- 获取属性-值:
HGETALL key
、redisTemplate.opsForHash().entries("key");
- 属性递增:
HINCRBY 小树 age 5
、redisTemplate.opsForHash().increment("小树","age",5L);
列表(list)\队列 :根据插入顺序排序的,可重复的数据列表,头部插入、尾部插入
- 存值:
LPUSH key 1 2 3
、redisTemplate.opsForList().leftPushAll("list",1,2,3,4,5);
–rpush key 1 2 3
、redisTemplate.opsForList().rightPushAll("list",5,4,3,2,1);
- 获取全部:
LRANGE key 0 -1
、redisTemplate.opsForList().range("key", 0, -1);
- 弹出:
redisTemplate.opsForList().leftPop("key", Duration.ofSeconds(10));
- 分页:
int start = (page - 1) * size;
int end = start + size-1;
List<Object> list = redisTemplate.opsForList().range("list", start, end);
集合(sets):不重复的
无序
集合,元素member
- 存值:
sadd k 1 2 3
、redisTemplate.opsForSet().add("k",1,2,3,4,5,"a","b");
- 取值:
SMEMBERS k
、redisTemplate.opsForSet().members("k");
- 差集:
sdiff set1 set2
、redisTemplate.opsForSet().difference("set1", "set2")
- 交集:
sinter set1 set2
、redisTemplate.opsForSet().intersect("set1","set2")
- 并集:
sunion set1 set2
、redisTemplate.opsForSet().union("set1","set2")
有序集合(sort sets):在sets基础上,每个member会关联一个double 类型的分数,分数小->大排序
- 存值:
zadd zset 10 "v6"
、redisTemplate.opsForZSet().add("zset","v1",10)
- 取值:
zrange zset 0 -1
、redisTemplate.opsForZSet().range("zset", 0, -1);
基数估算(hyperloglogs):在一批数据中,不重复元素的个数有多少
- 增加计数:
pfadd user zhangsan
(重复则不计数)、redisTemplate.opsForHyperLogLog().add(“user1”,“zhangsan”);- 获取计数:
pfcount user
、redisTemplate.opsForHyperLogLog().size("user")
- 合并:
pfmerge pv user paper
、redisTemplate.opsForHyperLogLog().union("user","user1","user2")
地理空间(Geohash)
- 存储:
geoadd "key" 104.085537 30.763127 地址
、redisTemplate.opsForGeo().add("成都",new Point(104.085537,30.763127),"春熙路")
- 取值:
geopos "成都" "春熙路" "地址二"
、redisTemplate.opsForGeo().position("成都", "春熙路");
- 距离:
geodist "成都" "d1" "d2" km
、redisTemplate.opsForGeo().distance("成都", "d1", "d2", Metrics.KILOMETERS);
- 范围:
GEORADIUSBYMEMBER "成都" "春熙路" 10 km
--成都key下,春熙路范围10km内的地点
//成都 key,春熙路范围5km的 地址
RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs()
.includeDistance().includeCoordinates().sortAscending().limit(6);
GeoResults<RedisGeoCommands.GeoLocation<Object>> radius = redisTemplate.opsForGeo()
.radius("成都", "春熙路", new Distance(5, Metrics.KILOMETERS),args);
流(Stream):消息队列实现,提供消息的持久化和主备复制功能