文章目录
Redis学习
一、 Redis简介
Redis是一个完全开源免费,遵守BSD协议,是一个高性能的内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理,也可基于内存亦可持久化的日志型。它支持字符串(String)、哈希表(Hash)、列表(List) 、集合(Set) 、有序集合(sorted sets)等数据类型。
Redis与其它的key-value存储有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
二、数据类型(命令)
1. Redis 字符串 (String)
命令 | 描述 |
---|---|
SET key value | 设置指定key的值 |
GET key | 获取指定key的值 |
GETRANGE key start end | 返回 key 中字符串值的子字符 |
GETSET key value | 将给定 key 的值设为 value ,并返回 key 的旧值(old value) |
MGET key1 [key2…] | 获取所有(一个或多个)给定 key 的值 |
STRLEN key | 返回 key 所储存的字符串值的长度 |
SETEX key seconds value | 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位) |
MSET key value [key value …] | 同时设置一个或多个 key-value 对 |
KEYS * | 查看redis中的所有数据 |
> 测试代码:
>
> 127.0.0.1:6379> keys * // (empty list or set)
> 127.0.0.1:6379> set logName zhangsan //OK
> 127.0.0.1:6379> set logPwd 123 //OK
> 127.0.0.1:6379> set logStatus 0 //OK
> 127.0.0.1:6379> keys *
> 1) "logPwd"
> 2) "logStatus"
> 3) "logName"
>
> 127.0.0.1:6379> get logName //"zhangsan"
> 127.0.0.1:6379> getrange logName 0 -1 //"zhangsan"
> 127.0.0.1:6379> getrange logName 0 -4 //"zhang"
> 127.0.0.1:6379> getset logName lisi //"zhangsan"
> 127.0.0.1:6379> get logName //"lisi"
> 127.0.0.1:6379> mget logName logPwd logStatus
> 1) "lisi"
> 2) "123"
> 3) "0"
>
> 127.0.0.1:6379> strlen logName //(integer) 4
> 127.0.0.1:6379> setex token 3 info //OK
> 127.0.0.1:6379> get token //"info"
> 127.0.0.1:6379> get token //(nil)
> 127.0.0.1:6379> get logStatus //"0"
> 127.0.0.1:6379> incr logStatus //(integer) 1
> 127.0.0.1:6379> decr logStatus //(integer) -1
2. Redis 集合(Set)
- Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
- Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
- 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
命令 | 描述 |
---|---|
SADD key member1 [member2] | 向集合添加一个或多个成员 |
SCARD key | 获取集合的成员数 |
SDIFF key1 [key2] | 返回给定所有集合的差集 |
SINTER key1 [key2] | 返回给定所有集合的交集 |
SISMEMBER key member | 判断 member 元素是否是集合 key 的成员 |
SMEMBERS key | 返回给定所有集合的交集返回集合中的所有成员 |
SMOVE source destination member | 将 member 元素从 source 集合移动到 destination 集合 |
SREM key member1 [member2] | 移除集合中一个或多个成员 |
SUNION key1 [key2] | 返回所有给定集合的并集 |
SSCAN key cursor [MATCH pattern] [COUNT count] | 迭代集合中的元素 |
SPOP key | 移除并返回集合中的一个随机元素 --(随机删除并返回删除的值) |
> 测试代码:
>
> 127.0.0.1:6379> sadd users tianqi //添加一个元素 (integer) 1
> 127.0.0.1:6379> sadd users zhangsan lisi wangwu zhaoliu //添加多个元素 (integer) 4
> 127.0.0.1:6379> smembers users //查看指定key的所有元素
> 1) "wangwu"
> 2) "zhaoliu"
> 3) "lisi"
> 4) "zhangsan"
> 5) "tianqi"
>
> 127.0.0.1:6379> scard users //获取集合的成员数 (integer) 5
> 127.0.0.1:6379> sadd other tom tim kim sam zhangsan lisi wangwu //(integer) 7
> 127.0.0.1:6379> sdiff users other //返回给定所有集合的差集
> 1) "tianqi"
> 2) "zhaoliu"
>
> 127.0.0.1:6379> sinter users other //返回给定所有集合的交集
> 1) "wangwu"
> 2) "lisi"
> 3) "zhangsan"
>
> 127.0.0.1:6379> sismember users zhangsan //判断给定元素是否在集合中 (integer) 1
> 127.0.0.1:6379> sismember users zhangsan2 //(integer) 0
> 127.0.0.1:6379> srem users tianqi //删除指定元素 (integer) 1
> 127.0.0.1:6379> smembers users //查看指定key的所有元素
> 1) "wangwu"
> 2) "zhaoliu"
> 3) "zhangsan"
> 4) "lisi"
> 127.0.0.1:6379> sunion users other //返回所有给定集合的并集
> 1) "wangwu"
> 2) "tim"
> 3) "tom"
> 4) "zhaoliu"
> 5) "sam"
> 6) "zhangsan"
> 7) "lisi"
> 8) "kim"
> 127.0.0.1:6379> sscan other 0 match t* //迭代集合中的元素
> 1) "0"
> 2) 1) "tom"
> 2) "tim"
>
> 127.0.0.1:6379> spop other //"zhangsan"
> 127.0.0.1:6379> smembers other
> 1) "kim"
> 2) "tom"
> 3) "tim"
3.Redis 有序集合(sorted set)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
命令 | 描述 |
---|---|
ZADD key score1 member1 [score2 member2] | 向有序集合添加一个或多个成员或更新已存在成员的分数 |
ZCARD key | 获取有序集合的成员数 |
ZCOUNT key min max | 计算在有序集合中指定区间分数的成员数 |
ZRANGE key start stop [WITHSCORES] | 通过索引区间返回有序集合成指定区间内的成员 |
ZRANK key member | 返回有序集合中指定成员的索引 |
ZREM key member [member …] | 移除有序集合中的一个或多个成员 |
ZREVRANGE key start stop [WITHSCORES] | 返回有序集中指定区间内的成员,通过索引,分数从高到底 |
ZSCORE key member | 返回有序集中,成员的分数值 |
ZREVRANK key member | 返回有序集合中指定成员的排名,分数值从大到小排序 |
> 测试代码:
>
> 127.0.0.1:6379> zadd myset 4 sayhi 5 sayhello 6 saybye //(integer) 3
> 127.0.0.1:6379> zcard myset //(integer) 5 获取有序集合的成员数
> 127.0.0.1:6379> zcount myset 2 3 //(integer) 2 指定区间分数的成员数
> 127.0.0.1:6379> zrange myset 2 3 // 通过索引区间返回有序集合成指定区间内的成员
> 1) "sayhi"
> 2) "sayhello"
> 127.0.0.1:6379> zrange myset 2 3 withscores
> 1) "sayhi"
> 2) "4"
> 3) "sayhello"
> 4) "5"
>
> 127.0.0.1:6379> zrank myset hi //(integer) 0 返回有序集合中指定成员的索引
> 127.0.0.1:6379> zrem myset sayhi sayhello //(integer) 2 移除有序集合中的一个或多个成员
> 127.0.0.1:6379> zrevrange myset 1 5 //返回有序集中指定区间内的成员,通过索引,分数从高到底
> 1) "hello"
> 2) "hi"
> 127.0.0.1:6379> zrevrange myset 1 5 withscores
> 1) "hello"
> 2) "3"
>
> 127.0.0.1:6379> zscore myset hello //"3" 返回有序集中,成员的分数值
> 127.0.0.1:6379> zrevrank myset hello //(integer) 1 返回有序集合中指定成员的排名,分数值从大到小排序
4. Redis 哈希(Hash)
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)
命令 | 描述 |
---|---|
HSET key field value | 将哈希表 key 中的字段 field 的值设为 value |
HMSET key field1 value1 [field2 value2 ] | 同时将多个 field-value (域-值)对设置到哈希表 key 中 |
HDEL key field2 [field2] | 删除一个或多个哈希表字段 |
HEXISTS key field | 查看哈希表 key 中,指定的字段是否存在 |
HGET key field | 获取存储在哈希表中指定字段的值 |
HGETALL key | 获取在哈希表中指定 key 的所有字段和值 |
HKEYS key | 获取所有哈希表中的字段 |
HLEN key | 获取哈希表中字段的数量 |
HMGET key field1 [field2] | 获取所有给定字段的值 |
HSETNX key field value | 只有在字段 field 不存在时,设置哈希表字段的值 |
HVALS key | 获取哈希表中所有值 |
HSCAN key cursor [MATCH pattern] [COUNT count] | 迭代哈希表中的键值对 |
> 测试代码:
>
> 127.0.0.1:6379> hset sets zhangsan 123 //添加一个键值对(integer) 1
> 127.0.0.1:6379> hmset sets wangwu 123 lisi 123 zhaoliu 123 //添加多个键值对 OK
> 127.0.0.1:6379> hget sets wangwu //获取指定key的值 "123"
> 127.0.0.1:6379> hgetall sets //获取所有键值对
> 1) "zhangsan"
> 2) "123"
> 3) "wangwu"
> 4) "123"
> 5) "lisi"
> 6) "123"
> 7) "zhaoliu"
> 8) "123"
>
> 127.0.0.1:6379> hkeys sets //获取所有key
> 1) "zhangsan"
> 2) "wangwu"
> 3) "lisi"
> 4) "zhaoliu"
>
> 127.0.0.1:6379> hvals sets //获取所有值
> 1) "123"
> 2) "123"
> 3) "123"
> 4) "123"
>
> 127.0.0.1:6379> hlen sets //获取key中键值对个数 (integer) 4
> 127.0.0.1:6379> hdel sets lisi //删除指定的key (integer) 1
> 127.0.0.1:6379> hmget sets zhangsan wangwu //获取指定多个key的所有val值
> 1) "123"
> 2) "123"
>
> 127.0.0.1:6379> hsetnx sets lisi 123 //如果字段不存在的时候,添加键值对 (integer) 1
> 127.0.0.1:6379> hsetnx sets lisi lisi //(integer) 0
> 127.0.0.1:6379> hscan sets 0 match *s* //迭代哈希表中的键值对
> 1) "0"
> 2) 1) "zhangsan"
> 2) "123"
> 3) "lisi"
> 4) "123"
5.Redis 列表(List)
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
6.Redis 键(key
Redis 键命令用于管理 redis 的键。