Redis中五大数据类型总结-spring-boot整合使用redis

 阿丹有话说:

        空闲时间整理了一下redis中常用的五种数据类型。查阅资料总结了底层和用法。确实有点乏味,但是相信我尝试理解,并动手去尝试,一定会让你对redis有一个新的认识!

卷起来!~

 

pom依赖

<dependencies>
    <!-- Redis 相关依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
</dependencies>

连接配置yml 

spring:
  redis:
    host: localhost
    port: 6379
    password:
    database: 0

 redis配置类

@Configuration
public class RedisConfig {

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory();
    }
}

 配置RedisTemplate

配置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;
    }
}

Redis的五大数据类型是:

字符串 (String)

列表 (List)

集合 (Set)

哈希 (Hash)

有序集合 (Sorted Set)

  • 字符串(string)类型

  • 字符串(String)在redis(小黑窗口)中的

(1)设置键值对

语法:set key value

用法:设置一个键值对

使用set语句mykey键存入字符串类型”Hello”

>set mykey “Hello”

(2)获取键对应的值

语法:get key

用法:获取键对应的值

get语句使用myket键拿出”Hello”

>get mykey

(3)追加字符串

语法:append key value

用法:将值追加到键值对的末尾

Append mykey “world”

Get myken

获得 “hello word”字符串

(4)替换字符串

语法: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”

说明:直接使用一样的键值将其覆盖掉,就是字符串中的替换

(5)删除键值对

语法:del key [key]

用法:删除一个或多个键值对

Del mykey

Get mykey

会获得一个空(nil)

字符串(String)在java中使用注入RedisTemplate<String, Object> redisTemplate;

中的用法

设置键值对

语法: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()’方法获取操作对象,然后调用该对象的方法来进行增删改查等

  • 列表 (List)数据类型redis中list数据类型在redis(小黑窗口)中的用法和语法

  • 增加元素到列表中:

语法:

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

在java中注入RedisTemplate<String, Object> redisTemplate;对象后操作redis中list类型的操作以及语法、用法

将一个或多个值从列表左侧推入

语法: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()’方法获取操作对象,然后调用该对象的方法来进行操作

集合 (Set)数据类型

Redis中的set数据类型是基于哈希表实现的。

具体来说:每个set对象在redis内部都由一个字典(哈希表)表示,其中set中的每个元素都对应着字典中的一个key,而value则被设置null.这样当需要判断某个元素是否存在于set中时,redis只需要判断该key是否在字典中即可。

使用哈希表作为set的底层数据结构,使得redis在添加、删除和查找操作上都能够达到O(1)的时间复杂度,因此set数据类型非常适合在redis中用于存储唯一性元素

set数据类型在redis小黑窗口中的语法以及用法

(1)添加一个或者多个元素到集合中                                                       

语法:sadd key member [member...]

用法:将一个或多个元素添加到指定键对应的集合中,并返回成功添加的元素数量

SADD myset "hello" "world"

(2)获取集合中的所有元素

语法:smembers key

用法:获取指定键对应的集合中的所有元素

SMEMBERS myset

(3)判断集合中是否存在一个指定的元素

语法:sismember key member

用法:判断指定键对应的集合中是否存在指定元素,若存在则返回1.否则返回0

SISMEMBER myset "hello"

(4)从集合中删除一个或者多个元素

语法:srem key member [member]

用法:将指定键对应的集合中的一个或者多个元素删除,并成功返回删除的元素数量

SREM myset "hello"

(5)获取集合中元素的数量

语法:scard key

用法:获取指定键对应的集合中元素的数量

SCARD myset

(6)将指定键对应的集合进行差集运算(不常用)

语法:sdiff key [key..]

用法:获取指定的一个或多个集合与指定键对应的集合的差集(即,属于指定键对应集合而不属于其它集合的元素)

SDIFF myset1 myset2

(7)将指定键对应的集合进行交集运算(不常用)

语法:sinter key [key..]

用法:获取指定的一个或多个集合与指定键对应的集合的交集(即,同时属于指定键对应集合和其它集合的元素)

SINTER myset1 myset2

(8)将指定键对应的集合进行并集运算(不常用)

语法:sunion key [key..]

用法:获取指定的一个或者多个集合与指定键对应的集合的并集(即,所有集合中不同的元素)

SUNION myset1 myset2

注意:set数据类型在redis中是无序的,并且每个元素必须是唯一的,因此,使用set数据类型时需要注意元素的唯一性,并根据实际业务场景选择合适的操作方式和运算方法

在java中注入RedisTemplate<String, Object> redisTemplate;对象后操作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’类型来指定元素和其对应的分数。另外,集合中的元素是无序,即使添加的顺序不同,最终得到的集合元素也是相同的。

哈希 (Hash)类型

类型说明以及底层原理:

在redis中,哈希表(Hash)类型的底层是通过使用一个数组和链表来实现的。具体来说,redis使用了一个称为“渐进式哈希的算法”,在哈希表元素数量达到一定阈值时,自动进行扩容操作。当哈希表扩容时,redis会创建一个新的数组,并将原有数组中的所有键值对重新散列到新数组中,以保证哈希表的性能和空间使用效率。同时,在哈希表中进行查找、添加、删除等操作时,redis会根据键的哈希值快速定位到对应的数据索引位置,并使用链表解决哈希冲突的问题。这样redis就可以高效地支持对大量键值对的存储、快速查找和修改等操作。

在redis窗口中的操作hash数据类型

增加操作

语法: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中

在java中注入RedisTemplate<String,Object> redisTemplate;操作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中

有序集合 (Sorted Set)类型(常用)

底层说明:

跳跃表是一种基于链表的数据结构,可用于实现有序集合等数据类型。它通过添加多级索引来加速查找操作,具有插入、删除、查找效率都很高的特点。Redis中的有序集合就使用了跳跃表作为其底层实现方式。

在有序集合中,每个元素都会被赋予一个分数(score),并按照分数从小到大排序。当多个元素的分数相同时,它们会根据成员(member)的字典序进行排序。

跳跃表在有序集合中的应用可以保证插入、删除和查找操作的时间复杂度都是O(log N),同时也支持快速的计算指定区间内元素的数量和分数范围内的所有元素。

因此,跳跃表不仅适用于有序集合着种数据类型,还可以被用于其它需要有序存储和查询的场景,比如排行榜、倒排索引等

Sorted set是redis中一种有序集合数据类型,它由一些元素组成,并且每个元素都可以对应一个分数(score),这个分数用来对元素进行排序和查找。

在redis窗口中的sorted set语法

添加元素

语法: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: 计算并集时的聚合方式

在java中注入RedisTemplate<String, Object> redisTemplate;对象后操作redis中Sorted Set类型的操作以及语法、用法

添加元素到sorted set

语法:redisTemplate.opsForZSet().add(key,value,score);

说明:其中,key表示sorted set的键名,value表示要添加的元素,score表示该元素的分值。

获取sorted set中指定成员的排名(从0开始计数)

语法:redisTemplate.opsForZSet().rank(key,value);

说明:其中key表示sorted set的键名,value表示要查询排名的元素

获取sorted set中指定成员的分值

语法:redisTemplate.opsForZSet().score(key,value);

说明:其中key表示sorted set的键名,value表示要查询分值的元素

获取sorted set中排名范围内的元素

语法:redisTemplate.opsForZSet().range(key,start,end);

说明:其中key表示sorted set的键名,start和end 表示排名范围的起始和结束位置

获取sorted set中指定分值范围内的元素

语法:redisTemplate.opsForSZet().rangeByScore(key,min,max);

说明:其中。Key表示sorted set的键名,min和max表示分值范围的最小值和最大值

删除sorted set中指定成员

语法:redisTemplate.opsForZSet().remove(key,value);

说明:其中,key表示sorted set的键名,value表示要删除的元素

获取sorted set中元素的数量

语法:redisTemplate.opsForZSet().size(key);

其中key表示sorted set的键名

下班!


  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值