1.Redis简介
Redis是一个远程内存数据库,是一个速度特别快的非关系数据库(non-relational database),它可以存储键(key)与5种不同类型的值(value)之间的映射。
1.Redis可以将存储在内存的键值对数据持久化到硬盘
2.可以使用复制特性来扩展读性能
3.还可以使用客户端分片来扩展写性能
注意:分片是一种将数据划分为多个部分的方法,对数据的划分可以基于键包含的ID、基于键的散列值,或者基于以上两者的某种组合。通过对数据进行分片,用户将数据存储在多台机器里,也可用从多台机器中获取数据,这种方法在解决某些问题时可以获得线性级别的性能提升。
1.1.Redis与其他数据库软件对比
Redis不使用表,它的数据库也不会预定义或者强制要求用户对Redis存储的不同数据进行关联。
名称 | 类型 | 数据存储选项 | 查询类型 | 附加功能 |
Redis | 使用内存存储(in-memory)的非关系数据库 | 字符串、列表、集合、散列、有序集合 | 每种数据类型都有自己的专属命令,还有批量操作和不完全的事务支持 | 发布订阅,主从复制,持久化,脚本 |
memcached | 使用内存存储的键值对缓存 | 键值之间的映射 | 创建命令,读取命令,更新命令,删除命令以及其他几个命令 | 为提升性能而设的多线程服务器 |
MySQL | 关系数据库 | 每个数据库可以包含多个表,每个表可以处理多个行,可以处理多个表的视图,支持空间和第三方扩展 | select、insert、update、delete、函数、存储过程 | 支持acid性质(需要使用innodb),主从复制和主主复制 |
postgreSQL | 关系数据库 | 每个数据库可以包含多个表,每个表可以处理多个行,可以处理多个表的视图,支持空间和第三方扩展,支持定制类型 | select、insert、update、delete、内置函数、自定义存储过程 | 支持acid性质,主从复制,有第三方支持的多主复制 |
MongoDB | 使用硬盘存储的非关系型数据库 | 每个数据库可以包含多个表,每个表可以包含多个scheme的bson文档 | 创建命令、读取命令、更新命令、删除命令、条件查询命令 | 支持map-reduce操作。主从复制,分片,空间suoyi |
2.Redis的数据结构简介
Redis可以存储5种不同的数据结构类型之间的映射,这5种数据类型分别为String (字符串)、List(列表)、Set (集合)、Hash(散列)和有序集合ZSet (有序集合)
结构类型 | 结构存储的值 | 结构的读写能力 |
String | 可以是字符串、整数或者浮点数 | 对整个字符串或者字符串的一部分执行操作;对整数和浮点数执行自增或者自减 |
List | 一个链表,链表上的每个节点都包含了一个字符串 | 从链表的两端推入或者弹出元素,根据偏移量对链表进行修剪,读取单个或者多个元素;根据值查找或者移除元素 |
Set | 包含字符串的无序收集器,并且被包含的每个字符串都是独一无二的 | 添加、获取、移除单个元素,检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里面随机获取元素 |
Hash | 包含键值对的无序散列 | 增加、获取、移除单个键值对;获取所有键值对 |
ZSet | 字符串成员与浮点数分值之间的有序映射,元素的排列顺序由分值的大小决定 | 添加、获取、移除单个元素;根据分值范围或者成员来获取元素 |
2.1.Redis中的String
字符串拥有和一些和其他键值存储相似的命令,比如get(查询)、set(获取)、del (删除)
命令 | 行为 |
get | 获取值 |
set | 存储值 |
del | 删除给定键的值 |
##启动Redis客户端
[root@localhost ~]# redis-cli
##数入密码
127.0.0.1:6379> AUTH 123456
##存储键为hello 值为world
127.0.0.1:6379> set hello world
OK
##获取刚才存入键为 hello的值
127.0.0.1:6379> get hello
"world"
###删除键为hello的值,返回删除的条数
127.0.0.1:6379> del hello
(integer) 1
##因为已经删除,查询已经没有了
127.0.0.1:6379> get hello
(nil)
2.2.Redis中的列表
一个列表结构可以有序的存储多个字符串。
命令 | 行为 |
rpush | 将给定值推入列表的右端 |
lpush | 将指定值推入列表的左侧 |
lrange | 获取列表给定范围上的所有值 |
lindex | 获取列表在给定位置上的单个元素 |
lpop | 从列表的左端弹出一个值,并返回被弹出的值 |
##在给列表存入一条数据时,该命令会返回列表当前的长度
127.0.0.1:6379> rpush list v1
(integer) 1
127.0.0.1:6379> rpush list v2
(integer) 2
127.0.0.1:6379> rpush list v3
(integer) 3
###使用0为范围的起始索引,-1为范围对的结束索引,可以取出列表包含的所有元素
127.0.0.1:6379> lrange list 0 -1
1) "v1"
2) "v2"
3) "v3"
####使用lindex 可以取出列表中的单个元素
127.0.0.1:6379> lindex list 2
"v3"
##从列表中弹出一个元素,该元素就不会存在于列表
127.0.0.1:6379> lpop list
"v1"
127.0.0.1:6379> lrange list 0 -1
1) "v2"
2) "v3"
2.3.Redis的集合
Redis的集合和列表都可以存储多个字符串,之间不同在于。列表可以存储多个相同的字符串,集合通过散列来保证存储的每个字符串都是各不相同,这些散列只有键,但是没有与键相关的值。
集合使用无需方式存储元素,所以不能像列表那样,将元素推入某一端,或者弹出
命令 | 行为 |
sadd | 将给定元素添加到集合 |
smembers | 返回集合包含的所有元素 |
sismember | 检查给定元素是否存在于集合 |
srem | 如果给定的元素存在于集合中,那么移除该y |
##将一个元素添加到集合,返回1表示成功添加,返回0表示该元素已经存在集合中
127.0.0.1:6379> sadd sets v1
(integer) 1
127.0.0.1:6379> sadd sets v2
(integer) 1
127.0.0.1:6379> sadd sets v2
(integer) 0
127.0.0.1:6379> sadd sets v3
(integer) 1
##获取集合的所有元素序列
127.0.0.1:6379> smembers sets
1) "v1"
2) "v3"
3) "v2"
##检查元素是否存在与集合
127.0.0.1:6379> sismember sets v2
(integer) 1
127.0.0.1:6379> sismember sets v5
(integer) 0
##移除集合中的元素,返回被移除的元素数量
127.0.0.1:6379> srem sets v1
(integer) 1
127.0.0.1:6379> srem sets v1
(integer) 0
127.0.0.1:6379> smembers sets
1) "v3"
2) "v2"
2.4.Redis的散列
Redis的散列可以存储多个键值对之间的映射,散列存储的值既可以是字符串也可以是数字,用户可以对散列存储的数字执行自增或者自减操作。
命令 | 行为 |
hset | 在散列里面关联起给定的键值对 |
hget | 获取指定散列键的值 |
hgetall | 获取散列包含的所有键值对 |
hdel | 如果给定键存在于散列里面,那么移除这个键 |
##添加键值对到散列时,命令会返回0或者1来表示给定的键是否存在于散列
127.0.0.1:6379> hset hashs key1 value1
(integer) 1
127.0.0.1:6379> hset hashs key2 value2
(integer) 1
127.0.0.1:6379> hset hashs key2 value2
(integer) 0
##获取散列包含的所有键值对
127.0.0.1:6379> hgetall hashs
1) "key1"
2) "value1"
3) "key2"
4) "value2"
##删除键值对时,会返回给定的键值对在删除前是否存在于散列
127.0.0.1:6379> hdel hashs key1
(integer) 1
127.0.0.1:6379> hdel hashs key1
(integer) 0
##从散列获取某个键的值
127.0.0.1:6379> hget hashs key2
"value2"
127.0.0.1:6379> hgetall hashs
1) "key2"
2) "value2"
2.2.Redis的有序集合
有序集合和散列一样,都是用于存储键值对,有序集合的键被称为成员(member),每个成员都是不同的;有序几个的值被称为分值(score),分值必须为浮点数。有序集合是Redis中唯一一个既可以根据成员访问元素,又可以根据分值以及分值的排列顺序来访问元素的结构。
命令 | 行为 |
zadd | 将一个带有给定分值的成员添加到有序集合里面 |
zrange | 根据元素在有序排列中所处的位置,从有序集合中获取多个元素 |
zrangebyscore | 获取有序集合在给定分值范围内的所有元素 |
zrem | 如果给定成员存在于有序集合,那么移除这个成员 |
##在添加元素到有序集合时,会返回0或1,显示元素以前是否存在于有序集合
127.0.0.1:6379> zadd zset 728 vv1
(integer) 1
127.0.0.1:6379> zadd zset 888 vv2
(integer) 1
127.0.0.1:6379> zadd zset 888 vv2
(integer) 0
## 查询有序集合包含的所有元素
127.0.0.1:6379> zrange zset 0 -1
1) "vv1"
2) "vv2"
##获取有序集合包含的所有元素,多个元素会按照分值大小进行排序
127.0.0.1:6379> zrange zset 0 -1 withscores
1) "vv1"
2) "728"
3) "vv2"
4) "888"
##根据分值获取有序几个中的一部分元素
127.0.0.1:6379> zrangebyscore zset 0 800 withscores
1) "vv1"
2) "728"
##在移除有序集合的元素的时候,命令返回移除元素的数量
127.0.0.1:6379> zrem zset vv1
(integer) 1
127.0.0.1:6379> zrem zset vv1
(integer) 0
127.0.0.1:6379> zrange zset 0 -1 withscores
1) "vv2"
2) "888"