赞
踩
阿丹有话说:
空闲时间整理了一下redis中常用的五种数据类型。查阅资料总结了底层和用法。确实有点乏味,但是相信我尝试理解,并动手去尝试,一定会让你对redis有一个新的认识!
卷起来!~
- <dependencies>
- <!-- Redis 相关依赖 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-redis</artifactId>
- </dependency>
- </dependencies>
- spring:
- redis:
- host: localhost
- port: 6379
- password:
- database: 0
- @Configuration
- public class RedisConfig {
-
- @Bean
- public RedisConnectionFactory redisConnectionFactory() {
- return new LettuceConnectionFactory();
- }
- }
配置RedisTemplate
- @Configuration
- public class RedisConfig {
-
- // 省略了redisConnectionFactory()方法
-
- @Bean
- public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
- RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
- redisTemplate.setConnectionFactory(redisConnectionFactory);
-
- // 设置key的序列化器
- redisTemplate.setKeySerializer(new StringRedisSerializer());
- redisTemplate.setHashKeySerializer(new StringRedisSerializer());
-
- // 设置value的序列化器
- redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
- redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
-
- return redisTemplate;
- }
- }
字符串 (String)
列表 (List)
集合 (Set)
哈希 (Hash)
有序集合 (Sorted Set)
语法:set key value
用法:设置一个键值对
使用set语句mykey键存入字符串类型”Hello”
>set mykey “Hello”
语法:get key
用法:获取键对应的值
get语句使用myket键拿出”Hello”
>get mykey
语法:append key value
用法:将值追加到键值对的末尾
Append mykey “world”
Get myken
获得 “hello word”字符串
语法:set key value [EX seconds] [PX milliseconds] [NX|XX]
对于参数的说明
Key :要设置的键名
Value:要设置的值
EX seconds:可选的参数,以秒为单位设置键值对的过期时间
PX milliseconds:可选的参数,以毫秒为单位谁知键值对过期的时间
NX:可选的参数,只有键不存在时才设置的值
XX:可选的参数,只有键已存在时才设置的值
用法:将值替换为新值
Set mykey “hi”
Set mykey “hello” EX 10 NX
说明:EX 10 表示键值对的有效时间为10秒;EX表示值不存在时的时候设置的
Get mykey 获得”hello”
说明:直接使用一样的键值将其覆盖掉,就是字符串中的替换
语法:del key [key]
用法:删除一个或多个键值对
Del mykey
Get mykey
会获得一个空(nil)
语法:redisTemplate.opsForValue().set(key,value)
用法:设置一个键值对
String key = “mykey”;
String value = “hello”
redisTemplate.opsForValue().set(key,value);
语法:redisTemplate.opsForValue().get(key)
用法:获取键对应的值
String key = “mykey”;
String value = redisTemplate.opsForValue().get(key);
语法:redisTemplate.opsForValue().append(key,value);
用法:将值追加到键值对的末尾
String key = “mykey”;
String value = “world”;
redisTemplate.opsForValue().append(key,value);
语法:redisTemplate.opsForValue.set(key,value,timeout,timeUnit)
用法:将值替换为新值并设置过期时间
String key = “mykey”;
String value= “Hello”;
Long timeout = 10;
TimeUnit timeUnit = TimeUnit.SECONDS;
redisTemplate.opsForValue().set(key,value,timeout,timeUnit);
上述示例将“mykey“的值设置为”hello”,并设置有效为10秒
语法:redisTemplate.delete(key);
用法:删除一个键值对
String key = “mykey”;
redisTemplate.delete(key);
上述示例将删除键为“mykey“的键值对
需要注意的是,在使用RedisTemplate操作String类型时,我们需要使用’opsForValue()’方法获取操作对象,然后调用该对象的方法来进行增删改查等
语法:
Lpush key value [value...]
Rpush key value [value...]
说明:L代表从左边加入,R代表从右边加入,因为redis中的list类型是基于双向链表实现的,在redis内部,每个list对象都由一个结构体表示,该结构体包含了头节点和尾节点两个指针,以及列表长度
用法:
Lpush mylist “world”
Rpush mylist “world”
在key对应的列表左侧/右侧插入一个或多个值,返回插入后列表的长度
语法:Lrange key start stop
说明:返回key对应的列表中从start到stop范围内的元素,start和stop都是0-based
用法:lrange mylist 0 -1
语法:lset key index value
说明:将key对应的列表中index位置的元素设置为value,返回OK表示修改成功
用法:lset mylist 0 “newhello”
语法:Lpop key/Rpop key
说明:移除并返回key对应列表中的左侧第一个元素/右侧第一个元素,因为redis中的list类型是基于双向链表开发的
用法:lpop mylist/rpop mylist
语法:redisTemplate.opsForList().leftPush(key,value)
用法:将一个值从列表左侧推入
String key = "mylist";
String value = "world";
redisTemplate.opsForList().leftPush(key, value);
将一个或者多个值从列表右侧推入
语法:redisTemplate.opsForList().rightPush(key,value)
用法:将一个值从列表右侧推入
String key = "mylist";
String value = "world";
redisTemplate.opsForList().rightPush(key, value);
语法:redisTemplate.opsForList().range(key,start,end);
用法:获取列表从start到end范围内的元素,包括start和end
String key = "mylist";
List<Object> list = redisTemplate.opsForList().range(key, 0, -1);
弹出左侧元素
语法:redisTemplate.opsForList().listPop(key);
用法:String key = "mylist";
Object value = redisTemplate.opsForList().leftPop(key);
弹出列表左侧的元素并返回其值
弹出右侧元素
语法:redisTemplate.opsForList().rightPop(key);
用法:String key = "mylist";
Object value = redisTemplate.opsForList().rightPop(key);
弹出列表右侧的元素并返回其值
语法:redisTemplate.opsForList().size(key);
用法:获取列表长度
String key = "mylist";
long size = redisTemplate.opsForList().size(key);
语法:redisTemplate.opsForList().index(key,index);
用法:根据索引获取列表中的元素
String key = "mylist";
int index = 0;
Object value = redisTemplate.opsForList().index(key, index);
语法:redisTemplate.opsForList().remover(key,count,value)
用法:从列表中删除count个值为value的元素
String key = "mylist";
long count = 1;
String value = "world";
redisTemplate.opsForList().remove(key, count, value);
注意:上述示例将从列表‘mylist’中删除第一个值为’world’的元素
需要注意的是,在RedisTemplate操作List类型时,我们需要使用’opsForList()’方法获取操作对象,然后调用该对象的方法来进行操作
Redis中的set数据类型是基于哈希表实现的。
具体来说:每个set对象在redis内部都由一个字典(哈希表)表示,其中set中的每个元素都对应着字典中的一个key,而value则被设置null.这样当需要判断某个元素是否存在于set中时,redis只需要判断该key是否在字典中即可。
使用哈希表作为set的底层数据结构,使得redis在添加、删除和查找操作上都能够达到O(1)的时间复杂度,因此set数据类型非常适合在redis中用于存储唯一性元素
语法:sadd key member [member...]
用法:将一个或多个元素添加到指定键对应的集合中,并返回成功添加的元素数量
SADD myset "hello" "world"
语法:smembers key
用法:获取指定键对应的集合中的所有元素
SMEMBERS myset
语法:sismember key member
用法:判断指定键对应的集合中是否存在指定元素,若存在则返回1.否则返回0
SISMEMBER myset "hello"
语法:srem key member [member]
用法:将指定键对应的集合中的一个或者多个元素删除,并成功返回删除的元素数量
SREM myset "hello"
语法:scard key
用法:获取指定键对应的集合中元素的数量
SCARD myset
语法:sdiff key [key..]
用法:获取指定的一个或多个集合与指定键对应的集合的差集(即,属于指定键对应集合而不属于其它集合的元素)
SDIFF myset1 myset2
语法:sinter key [key..]
用法:获取指定的一个或多个集合与指定键对应的集合的交集(即,同时属于指定键对应集合和其它集合的元素)
SINTER myset1 myset2
语法:sunion key [key..]
用法:获取指定的一个或者多个集合与指定键对应的集合的并集(即,所有集合中不同的元素)
SUNION myset1 myset2
注意:set数据类型在redis中是无序的,并且每个元素必须是唯一的,因此,使用set数据类型时需要注意元素的唯一性,并根据实际业务场景选择合适的操作方式和运算方法
语法:redisTemplate.opsForSet().add(key, value)
用法:将指定元素添加到指定键对应的集合中,并返回成功添加的元素数量
String key = "myset";
String value = "hello";
redisTemplate.opsForSet().add(key, value);
语法:redisTemplate.opsForSet().remove(key,value);
用法:将指定键对应的集合中的指定元素删除,并返回成功删除的元素数量
String key = "myset";
String value = "hello";
redisTemplate.opsForSet().remove(key, value);
语法:redisTemplate.opsForSet().members(key)
用法:获取指定键对应的集合的所有元素
String key = "myset";
Set<Object> set = redisTemplate.opsForSet().members(key);
语法:redisTemplate.opsForSet().isMember(key,value);
用法:判断指定键对应的集合中是否存在指定元素,如果存在则返回true,不然的话返回false
String key = "myset";
String value = "hello";
boolean exists = redisTemplate.opsForSet().isMember(key, value);
语法:redisTemplate.opsForSet().size(key)
用法:获取指定键对应的集合中元素的数量
String key = "myset";
long size = redisTemplate.opsForSet().size(key);
语法:redisTemplate.opsForSet().union(key,otherKey);
用法:将指定键和其它键对应的集合进行并集运算,获取所有集合的不同元素
String key = "myset1";
String otherKey = "myset2";
Set<Object> unionSet = redisTemplate.opsForSet().union(key, otherKey);
语法:redisTemplate.opsForSet().intersect(key,otherKey);
用法:将指定键和其它键对应的集合进行交集运算,获取所有同时属于这些集合的元素
String key = "myset1";
String otherKey = "myset2";
Set<Object> intersectSet = redisTemplate.opsForSet().intersect(key, otherKey);
语法:redisTemplate.opsForSet().difference(key,otherKey)
用法:将指定键对应的集合与其它键对应的集合进行差集运算,获取属于指定集合但不属于其它结合的元素
String key = "myset1";
String otherKey = "myset2";
Set<Object> differenceSet = redisTemplate.opsForSet().difference(key, otherKey);
注意:在使用redisTemplate操作set类型时,我们需要使用‘opsForSet()’方法来获取操作对象,并且对于值类型为字符串的集合,可以使用‘typedTuple’类型来指定元素和其对应的分数。另外,集合中的元素是无序,即使添加的顺序不同,最终得到的集合元素也是相同的。
类型说明以及底层原理:
在redis中,哈希表(Hash)类型的底层是通过使用一个数组和链表来实现的。具体来说,redis使用了一个称为“渐进式哈希的算法”,在哈希表元素数量达到一定阈值时,自动进行扩容操作。当哈希表扩容时,redis会创建一个新的数组,并将原有数组中的所有键值对重新散列到新数组中,以保证哈希表的性能和空间使用效率。同时,在哈希表中进行查找、添加、删除等操作时,redis会根据键的哈希值快速定位到对应的数据索引位置,并使用链表解决哈希冲突的问题。这样redis就可以高效地支持对大量键值对的存储、快速查找和修改等操作。
语法:hset key field value
用法:用于向哈希表中添加一个字段。如果字段已经存在。则会覆盖原有的值
Hest myhash field1 “hello”
语法:hmset key file value [field value..]
用法:使用 hmset命令向hash中批量添加新的字段和值
hmset myhash field1 “hello” field2 “world”
语法:hget key field
用法:使用hget命令获取hash中指定字段的值
Hget myhash field1
语法:hmget key field [field...]
用法:使用hmget命令获取hash中多个字段的值
Hmget myhash field1 field2
语法:hset key field value
用法:使用“hset”命令更新已有字段的值,和覆盖一个道理
Hest myhash field1 “world”
语法:hmset key field value [field value...]
用法:使用hmset命令批量更新已有字段的值
Hmset myhash field1 ‘hello’ field2 ‘redis’
语法:hdel key field [field....]
使用“hdel”命令删除hash中指定的字段
Hdel myhash field1
参数说明:
Key 表示要进行操作的hash的键名
Field 表示hash中的字段名(键)
Value 表示要存储在hash字段中的值
[field...] 可选参数。表示要删除的hash字段名列表,可以同时删除多个字段
拓展(有关哈希的其它操作)
Hgetall 返回hash中所有字段与值的列表
Hincrby 将指定字段的值自增指定的步长
Hexists 判断指定字段是否存在于hash中
说明:使用opsForHash()方法获取相关的操作对象
HashOperations<String, String, Object> hashOps = redisTemplate.opsForHash();
语法:redisTemplate.opsForHash().put()
用法:使用put方法向hash中添加新的字段和值
redisTemplate.opsForHash().put("myhash", "field1", "Hello");
语法:redisTemplate.opsForHash().putAll(“key”,map);
语法:先定义一个map,然后向map中添加键值对的方式,将整个map放入redisTemplate中
Map<String, Object> map = new HashMap<>();
map.put("field1", "Hello");
map.put("field2", "World");
redisTemplate.opsForHash().putAll("myhash", map);
语法:redisTemplate.opsForHash().get(“myhash”,”field1”);
用法:使用‘get’方法获取hash中指定字段的值
Object value = redisTemplate.opsForHash().get("myhash", "field1");
语法:List<Object> values = redisTemplate.opsForHash().multiGet()
用法:使用‘multiGet’方法获取hash中多个字段的值
List<Object> values = redisTemplate.opsForHash().multiGet("myhash", Arrays.asList("field1", "field2"));
说明:Arrays.asList()是java中的一个静态方法,用于将指定的对象转换为list集合
在上面的用法代码中使用Arrays.asList(“field1”,”field2”)来创建一个包含两个元素(即“field1”和“field2”)的List集合,作为’multiGet’方法的参数传递给RedisTemplate进行批量查询操作。
另外需要注意的是,“Arrays.asList()”方法返回的实际上是一个不可变的List集合,不能进行增删改操作。如果需要对List集合进行增删改操作,需要通过其它方式创建新的可变List集合
语法:redisTemplate.opsForHash().put()
用法:使用put方法更新已有字段的值
redisTemplate.opsForHash().put("myhash", "field1", "World");
语法:redisTemplate.opsForHash().putALL(“myhash”,map);
用法:使用putAll方法批量更新已有的字段的值
Map<String, Object> map = new HashMap<>();
map.put("field1", "Hello");
map.put("field2", "Redis");
redisTemplate.opsForHash().putAll("myhash", map);
语法:redisTemplate.opsForHash().delete(“myhash”,”field1”);
用法:使用delete方法删除hash中指定的字段
Long result = redisTemplate.opsForHash().delete("myhash", "field1");
参数解释:
Key 表示要进行操作的hash的键名
Field 表示hash中的字段名(键)
Value 表示要存储在hash字段中的值
Map 表示要批量添加或更新的hash字段和值的映射表
Fields 表示要查询或删除的hash字段名列表,可以同时查询或删除或多个字段
其它操作:
Entries 返回hash中所有字段与值的映射表
Increment 将指定字段的值自增指定的步长
Haskey 判断指定字段是否存在于hash中
底层说明:
跳跃表是一种基于链表的数据结构,可用于实现有序集合等数据类型。它通过添加多级索引来加速查找操作,具有插入、删除、查找效率都很高的特点。Redis中的有序集合就使用了跳跃表作为其底层实现方式。
在有序集合中,每个元素都会被赋予一个分数(score),并按照分数从小到大排序。当多个元素的分数相同时,它们会根据成员(member)的字典序进行排序。
跳跃表在有序集合中的应用可以保证插入、删除和查找操作的时间复杂度都是O(log N),同时也支持快速的计算指定区间内元素的数量和分数范围内的所有元素。
因此,跳跃表不仅适用于有序集合着种数据类型,还可以被用于其它需要有序存储和查询的场景,比如排行榜、倒排索引等
Sorted set是redis中一种有序集合数据类型,它由一些元素组成,并且每个元素都可以对应一个分数(score),这个分数用来对元素进行排序和查找。
语法:zadd key score1 member [score2 member2]
用法:zadd myzset 1 “one”
使用zadd指令添加数据
参数说明:
Key:sorted set的名称
Score:元素的分数,必须为浮点数
Member:元素的值,必须为字符串
语法:ZCARD key
用法:zcard myzset
Key:sorted set 的名称
语法:zcount key min max
用法:zcount myzet –inf +inf
参数说明:
Key:sorted set的名称
Min:分数上限
Max:分数下限
语法:zscore key member
用法:zscore myzset “one”
参数说明:
Key:sorted set的名称
Member:元素的值
语法:zrange key start stop [WITHSCORES]
用法:zrange myzset 0 2
参数说明:
Key: sorted set的名称
Start:排名下限。从0开始
Stop:排名上限。-1表示获取所有元素
WITHSCORES:是否同时返回元素的分数,默认不返回
语法:Zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
用法:zrangebyscore myzset –inf +inf
参数说明:
Key: sorted set的名称
Min:分数的上限
Max:分数的上限
WITHSCORES:是否同时返回元素的分数,默认不返回
LIMIT:返回元素的数量限制,格式为‘Limit offset count’
语法:zrem key member [member..]
用法:zrem myzset “one”
参数说明:
Key:sorted set的名称
Member:元素的值
语法:ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
用法:zinterstore out 2 zset1 zset2 WEIGHTS 2 3 AGGREGATE MAX
参数说明:
Destinaion:新的sorted set 的名称
Numkeys:参与计算的sorted set数量
Key:参与计算的sorted set名称列表
WEIGHTS:参与计算的sorted set权重列表
AGGREGATE:计算交集时的聚合方式
语法:ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
用法:ZUNIONSTORE out 2 zset1 zset2 WEIGHTS 2 3 AGGREGATE MAX
参数说明:
destination: 新的Sorted Set名称
numkeys: 参与计算的Sorted Set数量
key: 参与计算的Sorted Set名称列表
WEIGHTS: 参与计算的Sorted Set权重列表
AGGREGATE: 计算并集时的聚合方式
语法:redisTemplate.opsForZSet().add(key,value,score);
说明:其中,key表示sorted set的键名,value表示要添加的元素,score表示该元素的分值。
语法:redisTemplate.opsForZSet().rank(key,value);
说明:其中key表示sorted set的键名,value表示要查询排名的元素
语法:redisTemplate.opsForZSet().score(key,value);
说明:其中key表示sorted set的键名,value表示要查询分值的元素
语法:redisTemplate.opsForZSet().range(key,start,end);
说明:其中key表示sorted set的键名,start和end 表示排名范围的起始和结束位置
语法:redisTemplate.opsForSZet().rangeByScore(key,min,max);
说明:其中。Key表示sorted set的键名,min和max表示分值范围的最小值和最大值
语法:redisTemplate.opsForZSet().remove(key,value);
说明:其中,key表示sorted set的键名,value表示要删除的元素
语法:redisTemplate.opsForZSet().size(key);
其中key表示sorted set的键名
下班!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。