Redis是高性能的键值存储系统,它支持五种主要的数据类型:

  1. 字符串(String):字符串是Redis最简单的数据类型。它可以存储任何种类的数据,如文本、数字、二进制数据等。字符串类型的值最大可以存储512MB。
  2. 列表(List):列表是由字符串组成的有序数据结构,实现了一个双向链表。列表可用于实现队列、堆栈等数据结构。列表中的元素可以重复,并按照插入顺序排序。
  3. 集合(Set):集合是由字符串组成的无序且不重复的数据结构。集合可用于存储唯一数据、求交集、并集等操作。
  4. 有序集合(Sorted Set):有序集合是类似集合的数据结构,但每个元素都关联了一个分数(score),用于对元素进行排序。有序集合中的元素是唯一的,但分数可以重复。
  5. 哈希(Hash):哈希是一个键值对的集合,它是一个字符串字段和字符串值之间的映射。哈希特别适合用于存储对象,其中每个对象的字段都可以用字符串表示。相比于使用字符串类型来表示整个对象,哈希类型可以更方便地获取和设置对象的单个属性。

redis循环遍历list取数据 java redis list可以重复吗_字符串

结构类型

结构存储的值

结构的读写能力

String字符串

可以是字符串、整数或浮点数

对整个字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自减操作;

List列表

一个链表,链表上的每个节点都包含一个字符串

对链表的两端进行push和pop操作,读取单个或多个元素;根据值查找或删除元素;

Set集合

包含字符串的无序集合

字符串的集合,包含基础的方法有看是否存在添加、获取、删除;还包含计算交集、并集、差集等

Hash散列

包含键值对的无序散列表

包含方法有添加、获取、删除单个元素

Zset有序集合

和散列一样,用于存储键值对

字符串成员与浮点数分数之间的有序映射;元素的排列顺序由分数的大小决定;包含方法有添加、获取、删除单个元素以及根据分值范围或成员来获取元素

基础数据结构详解

String字符串

redis循环遍历list取数据 java redis list可以重复吗_哈希算法_02

命令使用

命令

简述

使用

GET

获取存储在给定键中的值

GET name

SET

设置存储在给定键中的值

SET name value

DEL

删除存储在给定键中的值

DEL name

INCR

将键存储的值加1

INCR key

DECR

将键存储的值减1

DECR key

INCRBY

将键存储的值加上整数

INCRBY key almount

DECRBY

将键存储的值减去整数

DECRBY key amount

实战场景

缓存:经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。

计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。

session:常见方案spring session + redis实现session共享;

List列表

Redis中的List其实就是链表(Redis用双端链表实现List)。

使用List结构,我们可以轻松地实现最新消息排队功能(比如新浪微博的TimeLine)。List的另一个应用就是消息队列,可以利用List的 PUSH 操作,将任务存放在List中,然后工作线程再用 POP 操作将任务取出进行执行。

redis循环遍历list取数据 java redis list可以重复吗_哈希算法_03

列表包含的元素,相同元素可以重复出现

命令使用

命令

简述

使用

RPUSH

将给定值推入到列表右端

RPUSH key value

LPUSH

将给定值推入到列表左端

LPUSH key value

RPOP

从列表的右端弹出一个值,并返回被弹出的值

RPOP key

LPOP

从列表的左端弹出一个值,并返回被弹出的值

LPOP key

LRANGE

获取列表在给定范围上的所有值

LRANGE key 0 -1

LINDEX

通过索引获取列表中的元素。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

LINEX key index

使用列表的技巧:

  • lpush+lpop=Stack(栈)
  • lpush+rpop=Queue(队列)
  • lpush+ltrim=Capped Collection(有限集合)
  • lpush+brpop=Message Queue(消息队列)

实战场景:

  • 微博TimeLine:有人发布微博,用lpush加入时间轴,展示新的列表信息
  • 消息队列

Set集合

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

redis循环遍历list取数据 java redis list可以重复吗_redis_04

命令使用

命令

简述

使用

SADD

向集合添加一个或多个成员

SADD key value

SCARD

获取集合的成员数

SCARD key

SMEMBER

返回集合中的所有成员

SMEMBER key member

SISMEMBER

判断 member 元素是否是集合 key 的成员

SISMEMBER key member

实战场景

标签(tag),给用户添加标签,或者用户给消息添加标签,这样有同一标签或者类似标签的可以给推荐关注的事或者关注的人。

点赞,或点踩,收藏等,可以放到set中实现

Hash散列

Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。

redis循环遍历list取数据 java redis list可以重复吗_字符串_05

命令使用

命令

简述

使用

HSET

添加键值对

HSET hash-key sub-key1 value1

HGET

获取指定散列键的值

HGET hash-key key1

HGETALL

获取散列中包含的所有键值对

HGETALL hash-key

HDEL

如果给定键存在于散列中,那么就移除这个键

HDEL hash-key sub-key1

实战场景

缓存:能直观,相比string更节省空间,的维护缓存信息,如用户信息,视频信息等。

Zset有序集合

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

redis循环遍历list取数据 java redis list可以重复吗_redis_06

命令使用

命令

简述

使用

ZADD

将一个带有给定分值的成员添加到哦有序集合里面

ZADD zset-key 178 member1

ZRANGE

根据元素在有序集合中所处的位置,从有序集合中获取多个元素

ZRANGE zset-key 0-1 withccores

ZREM

如果给定元素成员存在于有序集合中,那么就移除这个元素

ZREM zset-key member1

战场景

排行榜:有序集合经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。