likes
comments
collection
share

Redis基础和五大数据类型

作者站长头像
站长
· 阅读数 17

基础知识

redis默认有16个数据库。默认使用的是第0个。可以使用select进行切换数据库

Redis基础和五大数据类型

Set the number of databases. The default database is DB 0, you can select a different one on a per-connection basis using SELECT <-dbid> where dbid is a number between 0 and 'databases'-1

Redis基础和五大数据类型

当你使用select命令切换数据库后redis 的命令提示符多了个 [数据库号]。例如切换成select 12命令提示符前则变成了127.0.0.1:6379[12]使用0数据库默认不显示数据库号。

清除当前数据库 flushdb

Redis基础和五大数据类型

清除全部数据库的内容 flushall

Redis基础和五大数据类型

{% note success %} Redis 是单线程的 {% endnote %}

官方表示,Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据 机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了!所有就使用了单线程了! Redis 是C 语言写的,官方提供的数据为 100000+ 的QPS,完全不比同样是使用 key-vale的 Memecache差!

Redis 为什么单线程还这么快?

  • 误区1:高性能的服务器一定是多线程的?

  • 误区2:多线程(CPU上下文会切换!)一定比单线程效率高!

计算机中的运行速度CPU>内存>硬盘

核心:redis 是将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,多线程 (CPU上下文会切换:耗时的操作!!!),对于内存系统来说,如果没有上下文切换效率就是最高 的!多次读写都是在一个CPU上的,在内存情况下,这个就是最佳的方案!

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

Redis 键(key)

Redis 键命令用于管理 redis 的键。

语法

Redis 键命令的基本语法如下:COMMAND KEY_NAME

Redis keys 命令

序号命令及描述
1DEL key 该命令用于在 key 存在时删除 key。
2DUMP key 序列化给定 key ,并返回被序列化的值。
3EXISTS key 检查给定 key 是否存在。
4EXPIRE key seconds 为给定 key 设置过期时间,以秒计。
5EXPIREAT key timestamp EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。
6PEXPIRE key milliseconds 设置 key 的过期时间以毫秒计。
7PEXPIREAT key milliseconds-timestamp 设置 key 过期时间的时间戳(unix timestamp) 以毫秒计
8KEYS pattern 查找所有符合给定模式( pattern)的 key 。
9MOVE key db 将当前数据库的 key 移动到给定的数据库 db 当中。
10PERSIST key 移除 key 的过期时间,key 将持久保持。
11PTTL key 以毫秒为单位返回 key 的剩余的过期时间。
12TTL key 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
13RANDOMKEY 从当前数据库中随机返回一个 key 。
14RENAME key newkey 修改 key 的名称
15RENAMENX key newkey 仅当 newkey 不存在时,将 key 改名为 newkey 。
16TYPE key 返回 key 所储存的值的类型。

del key 该命令用于在 key 存在时删除 key。

keys *查找所有key

EXISTS key检查给定 key 是否存在

Move key db将当前数据库的 key 移动到给定的数据库 db 当中

Redis基础和五大数据类型

expire key seconds 为给定 key 设置过期时间,以秒计

ttl key 以秒为单位,返回给定 key 的剩余生存时间

type key返回 key 所储存的值的数据类型。

Redis基础和五大数据类型

字符串(String)

string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。

string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。

string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。

Redis 字符串命令

下表列出了常用的 redis 字符串命令:

序号命令及描述
1SET key value 设置指定 key 的值
2GET key 获取指定 key 的值。
3GETRANGE key start end 返回 key 中字符串值的子字符
4GETSET key value 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
5GETBIT key offset 对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
6[MGET key1 key2..] 获取所有(一个或多个)给定 key 的值。
7SETBIT key offset value 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
8SETEX key seconds value 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
9SETNX key value 只有在 key 不存在时设置 key 的值。
10SETRANGE key offset value 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。
11STRLEN key 返回 key 所储存的字符串值的长度。
12[MSET key value key value ...] 同时设置一个或多个 key-value 对。
13[MSETNX key value key value ...] 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
14PSETEX key milliseconds value 这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
15INCR key 将 key 中储存的数字值增一。
16INCRBY key increment 将 key 所储存的值加上给定的增量值(increment) 。
17INCRBYFLOAT key increment 将 key 所储存的值加上给定的浮点增量值(increment) 。
18DECR key 将 key 中储存的数字值减一。
19DECRBY key decrement key 所储存的值减去给定的减量值(decrement) 。
20APPEND key value 如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。

set key value设置指定key的值

get key获取指定key的值

strlen key返回 key 所储存的字符串值的长度

append key value如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。

Redis基础和五大数据类型

incr key将 key 中储存的数字值增一

incrby key increment将 key 所储存的值加上给定的增量值(increment)

decr key将 key 中储存的数字值减一

decrby key decrement key 所储存的值减去给定的减量值(decrement)

Redis基础和五大数据类型

getrange key start end 命令用于获取存储在指定 key 中字符串的子字符串。字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)。

setrange key offset value命令用value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。

Redis基础和五大数据类型

setex key seconds value将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。

setnx key value只有在 key 不存在时设置 key 的值

Redis基础和五大数据类型

mset key value key value....同时设置一个或多个key-value对

mget key1 key2 key3获取所有(一个或多个)给定 key 的值

msetnx key value key value....同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。

Redis基础和五大数据类型

getset key value将给定 key 的值设为 value ,并返回 key 的旧值(old value)。

Redis基础和五大数据类型

设置一个user:1对象值为json字符来保存一个对象!

Redis基础和五大数据类型

String类似的使用场景:value除了是我们的字符串还可以是我们的数字!

  • 计数器
  • 统计多单位的数量
  • 粉丝数
  • 对象缓存存储

列表(List)

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

Redis基础和五大数据类型

在redis里面,我们可以把list玩成 ,栈、队列、阻塞队列!

所有的list命令都是用l开头的,Redis不区分大小命令

Redis 列表命令

下表列出了列表相关的基本命令:

序号命令及描述
1[BLPOP key1 key2 ] timeout 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
2[BRPOP key1 key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
3BRPOPLPUSH source destination timeout 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
4LINDEX key index 通过索引获取列表中的元素
5LINSERT key BEFORE|AFTER pivot value 在列表的元素前或者后插入元素
6LLEN key 获取列表长度
7LPOP key 移出并获取列表的第一个元素
8[LPUSH key value1 value2] 将一个或多个值插入到列表头部
9LPUSHX key value 将一个值插入到已存在的列表头部
10LRANGE key start stop 获取列表指定范围内的元素
11LREM key count value 移除列表元素
12LSET key index value 通过索引设置列表元素的值
13LTRIM key start stop 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
14RPOP key 移除列表的最后一个元素,返回值为移除的元素。
15RPOPLPUSH source destination 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
16[RPUSH key value1 value2] 在列表中添加一个或多个值
17RPUSHX key value 为已存在的列表添加值

lpush key value1 value2命令将一个或多个值插入到列表头部。 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时,返回一个错误。

lrange key start stop获取列表指定范围内的元素

rpush key value1 value2命令用于将一个或多个值插入到列表的尾部(最右边)。

如果列表不存在,一个空列表会被创建并执行 RPUSH 操作。 当列表存在但不是列表类型时,返回一个错误。

Redis基础和五大数据类型

lpop key 命令用于移除并返回列表的第一个元素。

rpop key命令用于移除并返回列表的最后一个元素

Redis基础和五大数据类型

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

Redis基础和五大数据类型

llen key 命令用于返回列表的长度。 如果列表 key 不存在,则 key 被解释为一个空列表,返回 0 。 如果 key 不是列表类型,返回一个错误

Redis基础和五大数据类型

lrem key conut value 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。

COUNT 的值可以是以下几种:

  • count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
  • count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
  • count = 0 : 移除表中所有与 VALUE 相等的值。

Redis基础和五大数据类型

ltrm key start stop对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。

Redis基础和五大数据类型

rpoplpush source destination命令用于移除列表的最后一个元素,并将该元素添加到另一个列表并返回

Redis基础和五大数据类型

lset list index value通过索引来设置元素的值。当索引参数超出范围,或对一个空列表进行 LSET 时,返回一个错误。

Redis基础和五大数据类型

linsert key before | after privot value令用于在列表的元素前或者后插入元素。当指定元素不存在于列表中时,不执行任何操作。

当列表不存在时,被视为空列表,不执行任何操作。

Redis基础和五大数据类型

如果移除了所有值,空链表,也代表不存在! 在两边插入或者改动值,效率最高! 中间元素,相对来说效率会低一点~ 消息排队!消息队列 (Lpush Rpop), 栈( Lpush Lpop)!

集合(Set)

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

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

集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

Redis 集合命令

下表列出了 Redis 集合基本命令:

序号命令及描述
1[SADD key member1 member2] 向集合添加一个或多个成员
2SCARD key 获取集合的成员数
3[SDIFF key1 key2] 返回给定所有集合的差集
4[SDIFFSTORE destination key1 key2] 返回给定所有集合的差集并存储在 destination 中
5[SINTER key1 key2] 返回给定所有集合的交集
6[SINTERSTORE destination key1 key2] 返回给定所有集合的交集并存储在 destination 中
7SISMEMBER key member 判断 member 元素是否是集合 key 的成员
8SMEMBERS key 返回集合中的所有成员
9SMOVE source destination member 将 member 元素从 source 集合移动到 destination 集合
10SPOP key 移除并返回集合中的一个随机元素
11[SRANDMEMBER key count] 返回集合中一个或多个随机数
12[SREM key member1 member2] 移除集合中一个或多个成员
13[SUNION key1 key2] 返回所有给定集合的并集
14[SUNIONSTORE destination key1 key2] 所有给定集合的并集存储在 destination 集合中
15[SSCAN key cursor MATCH pattern] [COUNT count] 迭代集合中的元素

sadd key member1 member2...Redis Sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。

假如集合 key 不存在,则创建一个只包含添加的元素作成员的集合。

当集合 key 不是集合类型时,返回一个错误。

smembers key 命令返回集合中的所有的成员。 不存在的集合 key 被视为空集合

sismember key memberr 命令判断成员元素是否是集合的成员

scard key命令返回集合中元素的数量

srem key member1...mermber 命令用于移除集合中的一个或多个成员元素,不存在的成员元素会被忽略。

当 key 不是集合类型,返回一个错误。

Redis基础和五大数据类型

srandmember key [count]r 命令用于返回集合中的一个随机元素。

  • 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
  • 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。

Redis基础和五大数据类型

spop [count] 命令用于移除集合中的指定 key 的一个或多个随机元素,移除后会返回移除的元素。该命令类似 Srandmember 命令,但 SPOP 将随机元素从集合中移除并返回,而 Srandmember 则仅仅返回随机元素,而不对集合进行任何改动。

Redis基础和五大数据类型

smove source destination member 命令将指定成员 member 元素从 source 集合移动到 destination 集合。

SMOVE 是原子性操作。

如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。

当 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将 source 集合中的 member 元素删除。

当 source 或 destination 不是集合类型时,返回一个错误。

Redis基础和五大数据类型

sdiff first_key other_key1..other_keyn命令返回给定集合之间的差集。不存在的集合 key 将视为空集。

差集的结果来自前面的 FIRST_KEY ,而不是后面的 OTHER_KEY1,也不是整个 FIRST_KEY OTHER_KEY1..OTHER_KEYN 的差集。

sinter key key1..keyn 命令返回给定所有给定集合的交集。 不存在的集合 key 被视为空集。 当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。

sunion key key1...keyn 命令返回给定集合的并集。不存在的集合 key 被视为空集

Redis基础和五大数据类型

微博,A用户将所有关注的人放在一个set集合中!将它的粉丝也放在一个集合中! 共同关注,共同爱好,二度好友,推荐好友!(六度分隔理论

哈希(Hash)

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

Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

Map集合,key-map! 时候这个值是一个map集合! 本质和String类型没有太大区别,还是一个简单的 key-vlaue!

Redis hash 命令

下表列出了 redis hash 基本的相关命令:

序号命令及描述
1[HDEL key field1 field2] 删除一个或多个哈希表字段
2HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。
3HGET key field 获取存储在哈希表中指定字段的值。
4HGETALL key 获取在哈希表中指定 key 的所有字段和值
5HINCRBY key field increment 为哈希表 key 中的指定字段的整数值加上增量 increment 。
6HINCRBYFLOAT key field increment 为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
7HKEYS key 获取所有哈希表中的字段
8HLEN key 获取哈希表中字段的数量
9[HMGET key field1 field2] 获取所有给定字段的值
10[HMSET key field1 value1 field2 value2 ] 同时将多个 field-value (域-值)对设置到哈希表 key 中。
11HSET key field value 将哈希表 key 中的字段 field 的值设为 value 。
12HSETNX key field value 只有在字段 field 不存在时,设置哈希表字段的值。
13HVALS key 获取哈希表中所有值
14HSCAN key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的键值对。

hset key field value命令用于为哈希表中的字段赋值 。如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。如果字段已经存在于哈希表中,旧值将被覆盖。

hget key field命令用于返回哈希表中指定字段的值。

`hmset key field1 value1 field2 value2....同时将多个 field-value (域-值)对设置到哈希表 key 中。此命令会覆盖哈希表中已存在的字段。如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作。

hmget key field1 field2... 命令用于返回哈希表中,一个或多个给定字段的值。如果指定的字段不存在于哈希表,那么返回一个 nil 值。

hgetall key命令用于返回哈希表中,所有的字段和值。在返回值里,紧跟每个字段名(field name)之后是字段的值(value),所以返回值的长度是哈希表大小的两倍。

hdel key1 field1 key2 field2...命令用于删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。

hlen key获取哈希表中字段的数量

Redis基础和五大数据类型

hkeys key获取所有哈希表中的字段

hvals key获取哈希表中所有值

hincrby key field increment为哈希表 key 中的指定字段的整数值加上增量 increment 增量也可以为负数,相当于对指定字段进行减法操作

hsetnx key field value命令用于为哈希表中不存在的的字段赋值 。如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。如果字段已经存在于哈希表中,操作无效。如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令。

Redis基础和五大数据类型

hash变更的数据 user name age,尤其是是用户信息之类的,经常变动的信息! hash 更适合于对象的 存储,String更加适合字符串存储!

有序集合(sorted set)

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

Redis 有序集合命令

下表列出了 redis 有序集合的基本命令:

序号命令及描述
1[ZADD key score1 member1 score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
2ZCARD key 获取有序集合的成员数
3ZCOUNT key min max 计算在有序集合中指定区间分数的成员数
4ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
5[ZINTERSTORE destination numkeys key key ...] 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
6ZLEXCOUNT key min max 在有序集合中计算指定字典区间内成员数量
7[ZRANGE key start stop WITHSCORES] 通过索引区间返回有序集合指定区间内的成员
8[ZRANGEBYLEX key min max LIMIT offset count] 通过字典区间返回有序集合的成员
9[ZRANGEBYSCORE key min max WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员
10ZRANK key member 返回有序集合中指定成员的索引
11[ZREM key member member ...] 移除有序集合中的一个或多个成员
12ZREMRANGEBYLEX key min max 移除有序集合中给定的字典区间的所有成员
13ZREMRANGEBYRANK key start stop 移除有序集合中给定的排名区间的所有成员
14ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员
15[ZREVRANGE key start stop WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到低
16[ZREVRANGEBYSCORE key max min WITHSCORES] 返回有序集中指定分数区间内的成员,分数从高到低排序
17ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
18ZSCORE key member 返回有序集中,成员的分数值
19[ZUNIONSTORE destination numkeys key key ...] 计算给定的一个或多个有序集的并集,并存储在新的 key 中
20[ZSCAN key cursor MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成员和元素分值)

zadd key score1 value1....scoren valuen 向有序集合添加一个或多个成员,或者更新已存在成员的分数

`zrangebyscore key min max [withscores] [limit offset count] 返回有序集合中指定分数区间的成员列表。有序集成员按分数值递增(从小到大)次序排列。具有相同分数值的成员按字典序来排列(该属性是有序集提供的,不需要额外的计算)。默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。

Redis基础和五大数据类型

zrem key member1 mermber2...移除有序集合中的一个或多个成员

zcard key获取有序集合的成员数

zcount key min max 计算在有序集合中指定区间分数的成员数

Redis基础和五大数据类型

案例思路:set 排序 存储班级成绩表,工资表排序! 普通消息,1, 重要消息 2,带权重进行判断! 排行榜应用实现,取Top N 测试!