最近项目中用到Redis实现异步点赞功能。本文是学习笔记性质的博客,以深化理解和方便日后复习。
简介
定义
REmote DIctionary Server(Redis) 是一个key-value存储系统,是非关系型数据库(NoSQL)。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
对比
与关系数据库
相比于关系数据库,Redis不使用表,它的数据库也没有预定义或者强制的方式来要求用户关联Redis存储的不同数据。
与其他 key - value 缓存产品
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
数据类型与常用命令
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)
1. String(字符串)
String
特点
- string是redis最基本的类型,一个key对应一个value
- string类型是二进制安全的
意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 - 一个键最大能存储512MB
常用命令
命令 | 描述 |
---|---|
SET key value | 设置指定 key 的值 |
GET key | 获取指定 key 的值 |
GETRANGE key start end | 返回 key 中字符串值的子字符 |
STRLEN key | 返回 key 所储存的字符串值的长度 |
实例
> set hello world
OK
> get hello
"world"
> del hello
(integer) 1
> get hello
(nil)
使用了 Redis 的 SET 和 GET 命令。键为 name,对应的值为w3cschool.cn。
2. Hash(哈希)
Hash
特点
- Redis hash 是一个键值对集合
- Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象
- 每个 hash 可以存储 232 - 1 键值对(40多亿)
常用命令
命令 | 描述 |
---|---|
HSET key field value | 将哈希表 key 中的字段 field 的值设为 value |
HMSET key field1 value1 [field2 value2 ] | 同时将多个 field-value (域-值)对设置到哈希表 key 中 |
HGET key field | 获取存储在哈希表中指定字段的值 |
HGETALL key | 获取在哈希表中指定 key 的所有字段和值 |
实例
> hset hash-key sub-key1 value1
(integer) 1
> hset hash-key sub-key2 value2
(integer) 1
> hset hash-key sub-key1 value1
(integer) 0
> hgetall hash-key
1) "sub-key1"
2) "value1"
3) "sub-key2"
4) "value2"
> hdel hash-key sub-key2
(integer) 1
> hdel hash-key sub-key2
(integer) 0
> hget hash-key sub-key1
"value1"
> hgetall hash-key
1) "sub-key1"
2) "value1"
3. List(列表)
List
特点
- Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
- 列表最多可存储 232 - 1 元素 (40多亿)
常用命令
命令 | 描述 |
---|---|
LPUSH key value1 [value2] | 将一个或多个值插入到列表头部 |
LRANGE key start stop | 获取列表指定范围内的元素 |
LSET key index value | 通过索引设置列表元素的值 |
LPOP key | 移出并获取列表的第一个元素 |
实例
> rpush list-key item
(integer) 1
> rpush list-key item2
(integer) 2
> rpush list-key item
(integer) 3
> lrange list-key 0 -1
1) "item"
2) "item2"
3) "item"
> lindex list-key 1
"item2"
> lpop list-key
"item"
> lrange list-key 0 -1
1) "item2"
2) "item"
4. Set(集合)
Set
特点
- Redis的Set是string类型的无序集合
- 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
- 集合中最大的成员数为 232 - 1 元素 (40多亿)
常用命令
命令 | 描述 |
---|---|
SADD key member1 [member2] | 向集合添加一个或多个成员 |
SPOP key | 移除并返回集合中的一个随机元素 |
SCARD key | 获取集合的成员数 |
SMEMBERS key | 返回集合中的所有成员 |
实例
> sadd set-key item
(integer) 1
> sadd set-key item2
(integer) 1
> sadd set-key item3
(integer) 1
> sadd set-key item
(integer) 0
> smembers set-key
1) "item"
2) "item2"
3) "item3"
> sismember set-key item4
(integer) 0
> sismember set-key item
(integer) 1
> srem set-key item2
(integer) 1
> srem set-key item2
(integer) 0
> smembers set-key
1) "item"
2) "item3"
5. zset(sorted set:有序集合)
zset
特点
- Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员
- 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序
- zset的成员是唯一的,但分数(score)却可以重复
常用命令
命令 | 描述 |
---|---|
ZADD key score1 member1 [score2 member2] | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
ZCARD key | 获取有序集合的成员数 |
ZRANGE key start stop [WITHSCORES] | 通过索引区间返回有序集合成指定区间内的成员 |
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] | 通过分数返回有序集合指定区间内的成员 |
实例
> zadd zset-key 728 member1
(integer) 1
> zadd zset-key 982 member0
(integer) 1
> zadd zset-key 982 member0
(integer) 0
> zrange zset-key 0 -1 withscores
1) "member1"
2) "728"
3) "member0"
4) "982"
> zrangebyscore zset-key 0 800 withscores
1) "member1"
2) "728"
> zrem zset-key member1
(integer) 1
> zrem zset-key member1
(integer) 0
> zrange zset-key 0 -1 withscores
1) "member0"
2) "982"
参考文章
[Redis](https://www.bookstack.cn/read/Interview-Notebook/notes-Redis.md#%E4%B8%80%E3%80%81Redis %E6%98%AF%E4%BB%80%E4%B9%88)