Redis学习-----Redis的基本数据类型
Redis(Remote Dictionary Server)即远程字典服务,是一个开源的、使用 C 语言编写的、支持网络交互的、可基于内存也可持久化的日志型、Key-Value 数据库。它最早由意大利人 Salvatore Sanfilippo 开发,于 2009 年首次发布。与传统的关系型数据库不同,Redis 的数据主要存储在内存中,这使得它的读写速度非常快,能够轻松应对每秒数万次的操作。同时,Redis 也支持数据的持久化,可以将内存中的数据定期写入到硬盘中,以防止数据丢失。此外,Redis 还提供了丰富的数据结构和功能,如字符串、哈希、列表、集合、有序集合等,以及事务、发布订阅、Lua 脚本等高级特性,使其不仅可以作为缓存使用,还能用于实现分布式锁、计数器、排行榜等多种功能。
Redis 提供了多种数据类型,每种数据类型都有其独特的特点和适用场景,掌握这些数据类型是使用 Redis 的基础。
(一)字符串
字符串是 Redis 最基本的数据类型,它可以存储任何形式的字符串,包括二进制数据,最大长度为 512MB。字符串类型是其他数据类型的基础,很多高级功能都是基于字符串类型实现的。常见的操作命令主要有:
(1)SET key value:设置指定 key 的值。
(2)GET key:获取指定 key 的值。
(3)INCR key:将 key 中存储的数字值加 1,若 key 不存在,则初始化为 0 后再加 1。
(4)DECR key:将 key 中存储的数字值减 1,若 key 不存在,则初始化为 0 后再减 1。
(5)APPEND key value:将 value 追加到 key 原来的值的末尾。
例如
SET name "Redis"
GET name # 返回"Redis"
INCR count # count不存在,初始化为0后加1,返回1
INCR count # 返回2
DECR count # 返回1
APPEND name " Database" # name的值变为"Redis Database"
(二)哈希
哈希类型类似于 Java 中的 HashMap,是一个键值对的集合,其中每个键值对的键和值都是字符串类型。哈希类型适合存储对象,如用户信息、商品信息等,可以方便地对对象的各个字段进行操作。常见的哈希操作命令有:
(1)HSET key field value:将哈希表 key 中的字段 field 的值设为 value。
(2)HGET key field:获取哈希表 key 中字段 field 的值。
(3)HDEL key field:删除哈希表 key 中字段 field。
(4)HGETALL key:获取哈希表 key 中所有的字段和值。
(5)HKEYS key:获取哈希表 key 中所有的字段。
(6)HVALS key:获取哈希表 key 中所有的值。
代码实例:
HSET user:1 name "John" age "25" gender "male"
HGET user:1 name # 返回"John"
HGETALL user:1 # 返回name "John" age "25" gender "male"
HKEYS user:1 # 返回name age gender
HVALS user:1 # 返回"John" "25" "male"
HDEL user:1 gender # 删除gender字段
(三)列表
列表是一个有序的字符串列表,它可以按照插入顺序存储多个字符串元素,允许重复元素。列表的底层实现是双向链表,这使得在列表的两端进行插入和删除操作非常高效。常见的列表的操作命令有:
(1)LPUSH key value1 value2 ...:将一个或多个值插入到列表 key 的头部。
(2)RPUSH key value1 value2 ...:将一个或多个值插入到列表 key 的尾部。
(3)LPOP key:移除并返回列表 key 的头部元素。
(4)RPOP key:移除并返回列表 key 的尾部元素。
(5)LRANGE key start stop:返回列表 key 中从索引 start 到 stop 的元素(包含 start 和 stop),索引从 0 开始,负数表示从尾部开始计数。
(6)LLEN key:获取列表 key 的长度。
代码实例
LPUSH fruits "apple" "banana" # 列表头部插入apple、banana,列表为[banana, apple]
RPUSH fruits "orange" # 列表尾部插入orange,列表为[banana, apple, orange]
LPOP fruits # 移除并返回banana,列表变为[apple, orange]
LRANGE fruits 0 1 # 返回apple、orange
LLEN fruits # 返回2
(四)集合
集合是一个无序的字符串集合,它不允许重复元素。集合中的元素是唯一的,这使得它非常适合用于存储需要去重的数据,如用户的标签、好友列表等。常见的集合操作命令主要有:
(1)SADD key member1 member2 ...:向集合 key 中添加一个或多个成员。
(2)SMEMBERS key:返回集合 key 中的所有成员。
(3)SREM key member1 member2 ...:移除集合 key 中的一个或多个成员。
(4)SISMEMBER key member:判断 member 是否是集合 key 的成员。
(5)SCARD key:获取集合 key 的成员数量。
(6)SUNION key1 key2 ...:返回多个集合的并集。
(7)SINTER key1 key2 ...:返回多个集合的交集。
(8)SDIFF key1 key2 ...:返回多个集合的差集。
代码实例:
SADD tags "java" "python" "redis"
SMEMBERS tags # 返回java、python、redis(顺序不确定)
SISMEMBER tags "java" # 返回1(存在)
SREM tags "python" # 移除python
SCARD tags # 返回2
SADD tags2 "redis" "mysql" "mongodb"
SUNION tags tags2 # 返回java、redis、mysql、mongodb
SINTER tags tags2 # 返回redis
SDIFF tags tags2 # 返回java
(五)有序集合
有序集合与集合类似,也是一个不允许重复元素的集合,但它为每个元素关联了一个分数(score),并根据分数对元素进行排序。有序集合适合用于实现排行榜、优先级队列等功能。常见的有序集合的操作命令有:
(1)ZADD key score1 member1 score2 member2 ...:向有序集合 key 中添加一个或多个成员,并为每个成员设置分数。
(2)ZRANGE key start stop [WITHSCORES]:返回有序集合 key 中从索引 start 到 stop 的成员(包含 start 和 stop),按照分数从小到大排序,若指定 WITHSCORES,则同时返回分数。
(3)ZREVRANGE key start stop [WITHSCORES]:返回有序集合 key 中从索引 start 到 stop 的成员,按照分数从大到小排序。
(4)ZREM key member1 member2 ...:移除有序集合 key 中的一个或多个成员。
(5)ZSCORE key member:获取有序集合 key 中成员 member 的分数。
(6)ZCARD key:获取有序集合 key 的成员数量。
(7)ZINCRBY key increment member:为有序集合 key 中成员 member 的分数增加 increment。
代码实例:
ZADD ranking 90 "Alice" 85 "Bob" 95 "Charlie"
ZRANGE ranking 0 2 WITHSCORES # 返回Bob 85、Alice 90、Charlie 95
ZREVRANGE ranking 0 2 WITHSCORES # 返回Charlie 95、Alice 90、Bob 85
ZSCORE ranking "Alice" # 返回90
ZINCRBY ranking 5 "Alice" # Alice的分数变为95
ZCARD ranking # 返回3
ZREM ranking "Bob" # 移除Bob