Redis key 设计技巧

1: 把表名转换为key前缀 如, tag:

2: 2段放置用于区分区key的字段--对应mysql中的主键的列名,userid

3: 3段放置主键值,2,3,4...., a , b ,c

4: 4,写要存储的列名

 

用户表 user  , 转换为key-value存储

userid

username

passworde

email

9

Lisi

1111111

[email protected]

 

set  user:userid:9:username lisi

set  user:userid:9:password 111111

set  user:userid:9:email   [email protected]

 

keys user:userid:9*

 

 

2 注意:

在关系型数据中,除主键外,还有可能其他列也步骤查询,

如上表中, username 也是极频繁查询的,往往这种列也是加了索引的.

 

转换到k-v数据中,则也要相应的生成一条按照该列为主的key-value

Set  user:username:lisi:uid  9  

 

这样,我们可以根据username:lisi:uid ,查出userid=9,

再查user:9:password/email ...

 

完成了根据用户名来查询用户信息
php-redis扩展编译

 

1: pecl.php.net  搜索redis

2: 下载stable(稳定版)扩展

3: 解压,

4: 执行/php/path/bin/phpize (作用是检测PHP的内核版本,并为扩展生成相应的编译配置)

5: configure --with-php-config=/php/path/bin/php-config

6: make && make install

 

引入编译出的redis.so插件

1: 编辑php.ini

2: 添加

 

 

redis插件的使用

// get instance

$redis = new Redis();

 

// connect to redis server

$redis->open('localhost',6380);

$redis->set('user:userid:9:username','wangwu');

var_dump($redis->get('user:userid:9:username'));

 

 

 

 

 

 

 


微博项目的key设计

全局相关的key:

表名

global

列名

操作

备注

Global:userid

incr

产生全局的userid

Global:postid

Incr

产生全局的postid

 

 

用户相关的key()

表名

user

Userid

Username

Password

Authsecret

3

Test3

1111111

#U*Q(%_

 

redis,变成以下几个key

Key前缀

user

User:Userid:*

User:userid:*Username

User:userid:*Password

User:userid:*:Authsecret

User:userid:3

User:userid:3:Test3

User:userid:3:1111111

User:userid:3:#U*Q(%_

 

 

微博相关的表设计

表名

post

 

 

 

Postid

Userid

Username

Time

Content

4

2

Lisi

1370987654f

测试内容

 

微博在redis,与表设计对应的key设计

Key前缀

post

 

 

 

Post:Postid:*

Post:postid:*Userid

Post:postid:*:Username

Post:postid:*:Time

Post:postid:*:Content

4

2

Lisi

1370987654f

测试内容

 


关注表: following

Following:$userid -->

 

 

粉丝表

Follower:$userid --->

 

 

 

推送表:revicepost

 

3

4

7

 

 

 

 

 

 

 

=================拉模型,改进=====================

 

拉取表

 

3

4

7

 

 

 

 

 

 

: 上次我拉取了 A->5,67,三条微博, 下次刷新home.php, >7的微博开始拉取

解决: 拉取时,设定一个lastpull时间点, 下次拉取时,>lastpull的微博

 

: 有很多关注人,如何取?

解决: 循环自己的关注列表,逐个取他们的新微博

 

: 取出来之后放在哪儿?

: pull:$userid的链接里

 

: 如果个人中心,只有前1000

: ltrim,只取前1000

 

 

: 如果我关注 A,B两人, 2人中,各取3条最新信息

,3+3条信息, 从时间上,是交错的, 如何按时间排序?

: 我们发布时, 是发布的hash结构, 不能按时间来排序.

 

解决:  同步时,取微博后,记录本次取的微博的最大id,

下次同步时,只取比最大id更大的微博

 

 


Time taken for tests:   32.690 seconds

Complete requests:      20000

Failed requests:        0

Write errors:           0

Non-2xx responses:      20000

Total transferred:      13520000 bytes

Total POSTed:           5340000

HTML transferred:       9300000 bytes

Requests per second:    611.80 [#/sec] (mean)

Time per request:       81.726 [ms] (mean)

Time per request:       1.635 [ms] (mean, across all concurrent requests)

Transfer rate:          403.88 [Kbytes/sec] received

                        159.52 kb/s sent

                        563.41 kb/s total

 

Connection Times (ms)

              min  mean[+/-sd] median   max

Connect:        0    0   0.9      0      19

Processing:    14   82   8.4     81     153

Waiting:        4   82   8.4     80     153

Total:         20   82   8.2     81     153

 

Percentage of the requests served within a certain time (ms)

  50%     81

  66%     84

  75%     86

  80%     88

  90%     93

  95%     96

  98%    100

  99%    103

 100%    153 (longest request)

 

 

测试结果:

50个并发, 20000次请求, 虚拟下,未做特殊优化

每次请求redis写操作6.

30+秒左右完成.

 

平均每秒发布700条微博, 4000redis写入.

后台定时任务,回归冷数据入mysql
Redis配置文件

 daemonize yes  # redis是否以后台进程运行

 Requirepass  密码 # 配置redis连接的密码

:配置密码后,客户端连上服务器,需要先执行授权命令

# auth 密码

你可能感兴趣的:(redis)