一、Redis的基本介绍
Redis 是 C 语言开发的一个开源的(遵从 BSD 协议)高性能键值对(key-value)的内存数据库,可以用作数据库、缓存、消息中间件等。
它是一种 NoSQL(not-only sql,泛指非关系型数据库)的数据库。
1、优点:
Redis 作为一个内存数据库:
-
性能优秀,数据在内存中,读写速度非常快,支持并发 10W QPS。
-
单进程单线程,是线程安全的,采用 IO 多路复用机制。
-
丰富的数据类型,支持字符串(string)、散列(hash)、列表(list)、集合(set)、有序集合(sort set)等。
-
支持数据持久化。
可以将内存中数据保存在磁盘中,重启时加载。 -
主从复制,哨兵,高可用。
-
可以用作分布式锁。
-
可以作为消息中间件使用,支持发布订阅。
2、五种数据类型:
我们首先了解下 Redis 内部内存管理是如何描述这 5 种数据类型的。
首先 Redis 内部使用一个 redisObject 对象来表示所有的 key 和 value。
-
type :代表一个 value 对象具体是何种数据类型。
-
encoding :是不同数据类型在 redis 内部的存储方式,比如:type=string 代表 value 存储的是一个普通字符串,那么对应的 encoding 可以是 raw 或者是 int,如果是 int 则代表实际 redis 内部是按数值型类存储和表示这个字符串的,当然前提是这个字符串本身可以用数值表示,比如:“123” "456"这样的字符串。
-
vm 字段:只有打开了 Redis 的虚拟内存功能,此字段才会真正的分配内存,该功能默认是关闭状态的。 Redis 使用 redisObject 来表示所有的 key/value 数据是比较浪费内存的,当然这些内存管理成本的付出主要也是为了给 Redis 不同数据类型提供一个统一的管理接口,实际作者也提供了多种方法帮助我们尽量节省内存使用。
2.1 String
String 是 Redis 最基本的类型,一个 Key 对应一个 Value。Value 不仅是 String,也可以是数字。
String 类型是二进制安全的,意思是 Redis 的 String 类型可以包含任何数据,比如 jpg 图片或者序列化的对象。String 类型的值最大能存储 512M。
功能:
- 设置值:覆盖,创建新的(单个 key;多个 key)
- 获取值:获取单个,多个,获取后再修改
- 修改值:直接覆盖,追加,获取后再覆盖,修改指定位置
- 获取长度
命令名称 | 命令使用格式 | 命令介绍 | 命令例子 |
---|---|---|---|
set | set key value | 设置指定 key 的值 | set a 23 |
get | get key | 获取指定 key 的值 | get a |
setnx | setnx key value | nx 表示: not exists , 如果不存在则进行设置 | setnx a 45 |
getset | getset key value | 获取指定 key 的值然后再进行重新设置 | getset a 89 |
setrange | setrange key startIndex value | 表示把指定的 key 的值从开始索引开始使用 value 这个值进行替换 | setrange str 2 你好 |
mset | mset key1 value1 key2 value2… | 批量设置数据结构 | mset b 34 c 56 |
msetnx | msetnx key1 value1 key2 value2… | nx 表示: not exists , 如果可已经存在那么设置 失效 | msetnx a 11 |
getrange | getrange key startIndex endIndex | 获取指定返回内的数据 | getrange str 0 3 |
mget | mget key1 key2… | 批量获取多个 key 的值 | mget a b |
incr | incr key | 自增 1 | incr a |
incrby | incrby key num | 自增指定的数值 | incrby a 5 |
decr | decr key | 自减 1 | decr a |
decrby | decrby key num | 自减指定的数值 | decrby a 2 |
append | append key str | 给指定的 key 追加指定的 value 的值 | append a 哈 哈 |
strlen | strlen key | 获取指定的 key 的值长度 | strlen a |
2.2 Hash
类似于 Java 中的 Map 结构,数据是由 key-value 键值对组成的
功能:
- 添加:hset,hmset
- 修改:直接 set 就能修改
- 删除:根据 field 进行删除
- 获取:hget,hmget
命令名称 | 命令使用格式 | 命令介绍 | 命令例子 |
---|---|---|---|
hset | hset key field value | 给指定的 key 添加 key-value 元素 | hset user01 name zhangsan |
hget | hget key field | 获取指定的 key 中 filed 字段的值 | hget user01 name |
hsetnx | hsetnx key field value | 如果 key 不存在进行插入,如果 key 和 field 都存在不进行插入 | hsetnx user01 name lisi |
hexists | hexists key field | 判断指定的 key 中是否存在 field 这个字段 | hexists user01 name |
hlen | hlen key | 获取指定的 key 中字段的数量 | hlen user01 |
hdel | hdel key field1 field2… | 删除指定的 key 中的指定的字段 | hdel user01 name |
hincrby | hincrby key filed count | 给指定的key的field的字段添加或 者减去 count 这个值 | hincrby user01 age 4 |
hgetall | hgetall key | 获取 key 中所有的键值对 | hgetall user01 |
hkeys | hkeys key | 获取指定的 key 中所有的字段 | hkeys user01 |
hmget | hmget key field1 field2… | 获取指定的 key 中多个字段的值 | hmget user01 name age |
hmset | hmset key field1 value1 field2 value2… | 同时设置多个键值对数据 | hmset user01 phone 13121031209 |
hvals | hvals key | 获取指定的 key 中所有的 value | hvals user01 |
hincrbyfloat | l oat hincrbyfloat key field value | 给指定的字段添加浮点数的值 | hincrbyfloa t user01 age 3.4 |
2.3 List
在 redis 中 list 相当于我们 java 中的 LinkedList 可以从头部给列表添加元素,也可以从尾部给列表添加元素
**功能: **
- 加入元素:左(头)加入,右(尾)加入,在指定元素的前后插入元素
- 取元素:都是从左开始取(取集合,指定索引)
- 修改元素:修改指定索引位置的元素 删除元素:
- 删除指定值的元素,从左/右开始删除元素,
- 获取 list 长度
命令名称 | 命令使用格式 | 命令介绍 | 命令例子 |
---|---|---|---|
lpush | lpush key value1 value2 … | 往 list 集合中压入元素(l:表示左 的意思) | lpush list01 23 45 |
lrange | lrange key startIndex endIndex | 从集合中获取元素 | lrange list01 0 -1 |
linsert | linsert key before/after value newValue | 在指定的元素前或者后插入元素 | linsert list01 before 23 56 |
lset | lset key index newValue | 设置指定下标的值 | lset list01 1 88 |
lrem | lrem key count value | 删 除 count 个 与 value 相 同 的 元 素,count=0 表示删除所有 | lrem list 1 56 |
lpop | lpop key | 从 list 的头部删除元素 | lpop list01 |
lindex | lindex key index | 返回指定索引处的元素 | lindex list01 1 |
llen | llen key | 返回列表的长度 | llen list01 |
rpush | rpush key value | 从末尾压入元素(r:表示右的意思) | rpush list01 100 |
rpop | rpop key | 从尾部删除一个元素 | rpop list01 |
rpoplpus h | rpoplpush key1 key2 | 从 key1 链表中弹出最后一个元素然 后压入到 key2 链表中 | rpoplpush list01 list02 |
2.4 Set
Redis 的 Set 是 String 类型的无序集合。
集合成员是唯一的,这就意味着集合中不能出现重复的数据。类似于 java 中的 set 集合
命令名称 | 命令使用格式 | 命令介绍 | 命令例子 |
---|---|---|---|
sadd | sadd key member1 member2… | 添加元素 | sadd set01 23 45 67 45 |
scard | scard key | 获取成员的数量 | scard set01 |
smembers | smembers key | 获取所有的成员 | smembers set01 |
sismember | sismember key member | 判断是否存在 member 这个成员 | sismember set01 23 |
spop | spop key | 随机弹出一个成员 | spop set01 |
srandmember | srandmember key [count] | 随机获取一个或者多个成员 | srandmember set01 2 |
srem | srem key member1 member2 … | 删除一个或者多个成员,如果成员 不存在则忽略 | srem set01 23 45 |
smove | smove source desition member | 移动一个成员到指定的 set 中 | smove set01 set02 23 |
sdiff | sdiff first-key key1 key2… | 返回给定集合之间的差集。不存在 的集合 key 将视为空集 | sdiff set01 set02 |
sdiffstore | sdiffstore destionset key1 key2 … | 把获取到的差集保存到目标 set 中 | sdiffstore set03 set01 set02 |
sinter | sinter key1 key2… | 获取交集 | sinter set01 set02 |
sinterstore | sinterstore destionset key1 key2… | 把获取到的交集存储到目标 set 中 | sinterstore set03 set 01 set02 |
sunion | sunion key1 key2… | 获取并集 | sunion set01 set02 |
sunionstore | sunionstore destionset key1 key2… | 把获取到的并集存储到目标 set 中 | sunionstore set03 set01 set02 |
2.5 Zset(sortedSet)
redis 有序集合和 set 集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。
redis 正是通过分数来为集合中的成员进行从小到大的排序。
命令名称 | 命令使用格式 | 命令介绍 | 命令例子 |
---|---|---|---|
zadd | zadd key score1 member1 score2 member2… | 添加成员 | zadd zset01 1 a 2 b 3 c 4 d 5 e |
zcard | zcard key | 计算元素个数 | zadd zset01 |
zrange | zrange key start stop [WITHSCORES] | 返回指定排名之间的成员(结果 是分数由低到高) | zrange zset01 1 3 withscores |
zrevrange | zrevrange key start stop [WITHSCORES] | 返回指定排名之间的成员(结果 是分数由高到低) | zrevrange zset01 1 3 withscores |
zincrby | zincrby key number member | 给指定的 member 的分数添加或 者减去 number 这个值 | zincrby zset01 3 a |
zcount | zcount key min max | 获取分数在min和max之间的成 员和数量; 默认是闭区间; 想 不包含可以: (min (max | zcount zset01 3 5 |
zrangebyscore | zrangebyscore key min max [withscores] | 根据分数的范围获取成员(按照 分数: 从低到高) | zrangebyscore zset01 2 5 |
zrevrangebyscore | zrevrangebyscor e key max min [withscores] | 根据分数的范围获取成员(从高 到低) | zrevrangebyscore zset01 2 5 |
zrank | zrank key member | 返回一个成员的排名(从低到高 的顺序) | zrank zset01 3 |
zrevrank | zrevrank key member | 返回一个成员的排名(从高到 低) | zrevrank zset01 3 |
zscore | zscore key member | 获取一个成员的分数 | zscore zset01 3 |
zrem | zrem key member1 member2… | 删除指定的成员 | zrem zset01 2 |
zremrangebyrank | zremrangebyrank key start stop | 根据排名进行删除 | zremrangebyrank zset01 1 4 |
zremrangebyscore | zremrangebyscor e key min max | 根据分数的范围进行删除 | zremrangebyscore zset01 2 6 |
_
注: 和 storedset 类型的数据结构相关的命令都是以 z 开始的
3 、对 Key 的通用操作
Redis 是一个 key-value 的数据库,我们可以直接对应 key 进行相关操作
命令名称 | 命令使用格式 | 命令介绍 | 命令例子 |
---|---|---|---|
keys | keys pattern | 根据指定的规则返回符合条件的 key | keys set0* |
del | del key1 key2… | 删除指定的 key | del set01 |
exists | exists key | 判断是否存在指定的 key | exists set01 |
move | move key db | 将指定的 key 移入到指定的数据库 中: redis 默认存在 16 个库 select 10 : 表示选择 9 号库 | move set02 10 |
rename | rename key newkey | 对 key 进行重命名 | rename set02 set06 |
renamenx | renamenx key newkey | 仅当 newkey 不存在时,将 key 改 名为 newkey | renamenx set06 set07 |
type | type key | 返回 key 的类型 | type set01 |
expire | expire key second | 给指定的 key 设置失效时间,单位为 秒 | rexpire set01 60 |
persist | persist key | 移除 key 的失效时间 | persist set01 |
ttl | ttl key | 以秒为单位返回 key 的剩余时间(返 回-2 表示 key 不存在, 返回-1 表示 永远不过时) | ttl set01 |