Redis 数据类型

数据类型:

字符串(strings) :字符存储

  • 存值:set k vredisTemplate.opsForValue().set("k",v);
  • 取值:get kredisTemplate.opsForValue().get("k");
  • 批量 mset k4 v4 k5 v6redisTemplate.opsForValue().multiSet(map);
  • 递加:(数值型字符)incr kredisTemplate.opsForValue().increment("k")
  • 递减:decr keyredisTemplate.opsForValue().decrement("k")
  • 不存在则设值:setnx k vredisTemplate.opsForValue().setIfAbsent("k1",2,Duration.ofSeconds(30));
  • 存在k,才设值: redisTemplate.opsForValue().setIfPresent("k2",3);
  • 设置key,并设置过期时间(秒): setex k 10 1
  • 设置key,过期时间:expire key 30redisTemplate.expire("k2",Duration.ofSeconds(30));
  • 查询key :keys PATTERN,如 keys k*redisTemplate.keys("k*")
  • 拼接value: APPEND key valueredisTemplate.opsForValue().append("a3", "b") ;返回拼接后字符长度

string- 位图(bitmap) :对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)

  • 存储:setbit key 1 1redisTemplate.opsForValue().setBit("key",1,true)
  • 0 1 0 0 0 0 0 0 ;一个字符8字节,默认8个二进制位.
  • 取值: getbit key 1redisTemplate.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 1redisTemplate.opsForHash().put("小树","age",10)
  • 取值: hmget 小树 ageredisTemplate.opsForHash().get("小树", "age")
  • 获取属性-值:HGETALL keyredisTemplate.opsForHash().entries("key");
  • 属性递增: HINCRBY 小树 age 5redisTemplate.opsForHash().increment("小树","age",5L);

列表(list)\队列 :根据插入顺序排序的,可重复的数据列表,头部插入、尾部插入

  • 存值: LPUSH key 1 2 3redisTemplate.opsForList().leftPushAll("list",1,2,3,4,5);
    rpush key 1 2 3redisTemplate.opsForList().rightPushAll("list",5,4,3,2,1);
  • 获取全部:LRANGE key 0 -1redisTemplate.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 3redisTemplate.opsForSet().add("k",1,2,3,4,5,"a","b");
  • 取值:SMEMBERS kredisTemplate.opsForSet().members("k");
  • 差集:sdiff set1 set2redisTemplate.opsForSet().difference("set1", "set2")
  • 交集:sinter set1 set2redisTemplate.opsForSet().intersect("set1","set2")
  • 并集: sunion set1 set2redisTemplate.opsForSet().union("set1","set2")

有序集合(sort sets):在sets基础上,每个member会关联一个double 类型的分数,分数小->大排序

  • 存值:zadd zset 10 "v6" redisTemplate.opsForZSet().add("zset","v1",10)
  • 取值:zrange zset 0 -1redisTemplate.opsForZSet().range("zset", 0, -1);

基数估算(hyperloglogs):在一批数据中,不重复元素的个数有多少

  • 增加计数:pfadd user zhangsan (重复则不计数)、redisTemplate.opsForHyperLogLog().add(“user1”,“zhangsan”);
  • 获取计数:pfcount userredisTemplate.opsForHyperLogLog().size("user")
  • 合并:pfmerge pv user paperredisTemplate.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" kmredisTemplate.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):消息队列实现,提供消息的持久化和主备复制功能

你可能感兴趣的:(缓存,笔记,redis,nosql)