写在前面
Redis 是一种基于内存的数据库,并且提供一定的持久化功能,它是一种键值(key-value)数据库,使用 key 作为索引找到当前缓存的数据,并且返回给程序调用者。
当前的 Redis 支持 5 种基础数据类型,它们分别是字符串(String)、列表(List)、集合(set)、哈希结构(hash)和有序集合(zset)。
使用 Redis 编程要熟悉这 5 种基础数据类型,并且了解它们常用的命令。Redis 定义的这 5 种数据类型是十分有用的,它除了提供简单的存储功能,还能对存储的数据进行一些计算。
比如字符串可以支持浮点数的自增、自减、字符求子串,集合求交集、并集,有序集合进行排序等,所以使用它们有利于对一些不太大的数据集合进行快速计算,简化编程,同时它也比数据库要快得多,所以它们对系统性能的提升十分有意义。
String(字符串)
string
是redis
最基本的类型,你可以理解成与Memcached
一模一样的类型,一个key
对应一个value
。
string
类型是二进制安全的。意思是redis
的string
可以包含任何数据。比如jpg
图片或者序列化的对象 。
string
类型是Redis
最基本的数据类型,一个键最大能存储512MB。
常用命令
// 添加或修改数据 set key value // 获取数据 get key // 删除数据 del key 复制代码
// 添加或修改多个数据 mset key1 value1 key2 vlaue2 ... // 获取多个数据 mget key1 key2 ... 复制代码
// 获取数据字符个数(字符串长度) strlen key // 追加信息到原始信息后部(如果原始信息存在就追加,否则新建) append key value 复制代码
Hash(哈希)
Redis hash
是一个键值 (key=>value)
对集合。
Redis hash
是一个 string
类型的 field
和 value
的映射表,hash
特别适合用于存储对象。
常用命令
// 添加或修改数据 hset key field value // 获取字段的数据 hget key field // 获取所有字段数据 hgetall key // 删除数据 hdel key field1 [field2] 复制代码
// 添加或修改多个数据 hmset key field1 value1 field2 calue2 // 获取多个数据 hmget key field1 field2 ... // 获取hash表中字段的数量 hlen key // 获取哈希表中是否存在指定的字段 hexists key field 复制代码
注意事项
hash类型下的value只能存储字符串,不允许存储其他类型数据,不存在嵌套现象。如果数据未获取到,对应的值为(nil)
每个hash可以存储232-1个键值对
hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计不是为了存储大量对象的,切记不可滥用,更不可以将hash作为对象列表使用
hgetall操作可以获取全部属性,如果内部fiekd过多,遍历整体数据效率就会很低,有可能成为数据访问瓶颈。
List(列表)
Redis
列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分。
需要的存储数据:一个存储空间保存多个数据,且通过数据可以体现进入顺序。
list类型:保存多个数据,底层使用双向链表存储结构实现。
在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其左部(left)和右部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表,如果这个键已经存在,则是向list添加元素。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是40亿个。
常用命令
// 添加或修改数据 lpush key value1 [value2] ... rpush key value1 [value2] ... // 获取数据 lrange key start stop // 获取从左数第start到stop个元素,从0开始 lindex key index // 查询第i个元素 llen key // list的长度 // 获取并移除数据 lpop key // 获取并删除左边第一个元素 rpop key // 获取并删除右边第一个元素 // 规定时间内获取并移除数据 blpop key1 [key2] timeout brpop key1 [key2] timeout 复制代码
Set(集合)
Redis
的 Set
是 string
类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
新的存储需求:存储大量的数据,在查询方面提供更高的效率。
需要的存储结构:能够保存大量的数据,搞笑的内部存储机制,便于查询
set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值式不允许重复的。也就是只有键没有值的hash
常用命名
// 添加数据 sadd key menber1 [member2] // 获取全部数据 smembers key // 删除数据 srem key member1 [member2] // 获取集合数据总量 scard key // 判断集合中是否包含指定数据 sismember key member 复制代码
zset(sorted set:有序集合)
Redis zset
和 set
一样也是 string
类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double
类型的分数。redis
正是通过分数来为集合中的成员进行从小到大的排序。
zset
的成员是唯一的,但分数(score)
却可以重复。
新的存储需求:根据排序有利于数据的有效显示,需要提供一种可以根据自身特征进行排序的方式。
需要的存储结构:新的存储模型,可以保存可排序的数据。
sorted_set类型:在set的存储结构基础上添加可排序字段。
常用命令
// 添加数据 zadd key score1 member1 [score2 member2] // 获取全部数据 //按照从小到大的顺序,加上WITHSCORES,就会带上scores一起显示 zrange key start stop [WITHSCORES] // 按照从大到小的顺序 zrevrange key start stop [WITHSCORES] // 删除数据 zrem key member [member …]