之前对redis的误区:以为redis是一个大的整体,所有的数据都存储到redis中,但是实际并不是这样。redis有database的概念(redis可理解为mysql)。
redis的database类似于mysql。mysql存数据需要首先新建数据库,然后在数据库中建表,然后数据存到表中。redis也一样,需要先选择数据库,然后在数据库中存放key。
只不过redis的数据库在redis服务开启时就建成功了,默认为16个database,redis下,数据库是由一个整数索引标识,database下表从0-15。
可以看到redis的配置文件中有database配置项,注释中写着默认database为0,也就是说我们客户端实例化redis时如果不指定database的话,默认的redis操作都是在database为0的数据库内操作。
# 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
databases 16
Select 命令用于切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值。
127.0.0.1:6379> set a 1 //默认下标为0的database
OK
127.0.0.1:6379> get a
"1"
127.0.0.1:6379> select 1 //切换到下标为1的database
OK
127.0.0.1:6379[1]> get a //每个database间数据是不共享的,类似于mysql的database
(nil)
flushdb是清楚当前库中的所有数据
127.0.0.1:6379[1]> flushdb //清空database为1的所有数据
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
flushall是清空所有库的数据。如果发现还有数据,说明此数据在删除又自动生成的。
127.0.0.1:6379> flushall
OK
database中的key都是存放到槽中的,每个database里面有2^14个槽(单节点)。每个槽能存放多少需要根据redis的内存和key的大小来判断,比如redis为4G内存,则每个槽能存放的容量就是4G/16384。key的定位规则是根据CRC-16(key)%16384的值来判断属于哪个槽。
每个redis的database中的2的14次个槽是针对单节点redis来说的,如果是cluster集群的话,比如有2个master节点,2master节点都使用redis的database为0的数据库,此时2的14次个槽会被俩节点的database为0的数据库均匀分割。
redis set key:key1冒号的用法
我们正常使用redis存储是
Redis::set('company','zuoxin');
但是现在存储时候可以使用冒号:来存储
Redis::set('company:count',36);
Redis::set('company:employer','xiaoyu');
Redis::set('company:area',100);
:的作用就是相当于是分组,将key冒号前缀相同的key放到一个已前缀命名目录下,这样便于查找,在rdm中显示如下
![](https://img.haomeiwen.com/i15579250/22d53381c1646570.png)
阿里的集群版redis架构图
![](https://img.haomeiwen.com/i15579250/f5a76b917611e961.png)
最下层架构和redis cluster架构很像,采用主备,分片存储,一共4个节点,2个master节点,2个slave节点。一共16384个槽均匀分到2个master节点上。
redis clutser使用CRC-16(key)%16384来定位key属于哪个槽,一个槽里面可以放多个key。而阿里的redis中的proxy层的作用就是对key进行hash,然后根据结果放到相应的槽内。
阿里集群版redis如果想是用lua代码的话(eval()函数),要确保key在同一个slot中。而laravel的中的redis队列就是正好使用lua代码的eval()函数,如果你正好使用laravel的redis队列,该集群将不适合你。
但是我们可以使用阿里的标准版的双副本实例,该实例是俩节点,同样是主备节点,可以实现高可用。但是该种实例不要求key在同一个slot中,所以可以使用。
网友评论