標籤:
 
一、利用redis快取資料建立與mysql一致的資料
先示範下實現mysql表中與redis資料統一的效果,看一下mysql中資料結構設計和redis有些什麼區別
1.有如下兩張資料表
CREATE TABLE `user` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) NOT NULL COMMENT ‘使用者名稱‘,
  `password` varchar(25) NOT NULL COMMENT ‘密碼‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT=‘使用者資訊表‘;
 
CREATE TABLE `archives` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `userid` int(10) NOT NULL COMMENT ‘使用者id‘,
  `username` varchar(20) NOT NULL COMMENT ‘發布微博的使用者名稱稱‘,
  `post_time` datetime NOT NULL COMMENT ‘發布時間‘,
  `content` varchar(200) NOT NULL COMMENT ‘微博內容‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT=‘使用者發布的微博資訊表‘;
 
2.mysql表資料如下
user表資料如下
mysql> select * from user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | dongzi   | 123456   |
|  2 | lidong   | 123456   |
+----+----------+----------+
 
archives表資料如下
mysql> select * from archives;
+----+--------+----------+---------------------+--------------------------------------------+
| id | userid | username | post_time           | content                                    |
+----+--------+----------+---------------------+--------------------------------------------+
|  1 |      1 | dongzi   | 2016-06-22 16:00:40 | 我是使用者東子,我的第一條微博               |
|  2 |      2 | lidong   | 2016-06-22 16:10:40 | 我是使用者lidong,我的第一條微博             |
|  3 |      2 | lidong   | 2016-06-22 17:05:40 | 我是使用者lidong,我的第二條微博             |
+----+--------+----------+---------------------+--------------------------------------------+
 
3.使用redis增加user表和archives資料
在user表中增加第一個使用者
incr global:user    --讓使用者表id自增,此時id為1,為了實現mysql中的auto_increment
set user:userid:1:username dongzi
set user:userid:1:password 123456
set user:username:dongzi:userid 1 --設定這個key是為了利用使用者名稱來反查使用者id
?
在user表中增加第二個使用者
incr global:user                    --現在返回的值為2              
set user:userid:2:username lidong
set user:userid:2:password 123456
set user:username:lidong:userid 2 --設定這個key是為了利用使用者名稱來反查使用者id
 
發布第一條微博
incr global:archives    ?    ?--記錄archives表的id
hset archives:id:1 userid 1
hset archives:id:1 username dongzi
hset archives:id:1 post_time ‘2016-06-22 16:00:40‘
hset archives:id:1 content ‘我是使用者東子,我的第一條微博‘
lpush archives:userid:1 1 --記錄使用者id發布的所有微博id
 
發布第二條微博
incr global:archives
hset archives:id:2 userid 2
hset archives:id:2 username lidong
hset archives:id:2 post_time ‘2016-06-22 16:14:34‘
hset archives:id:2 content ‘我是使用者lidong,我的第一條微博‘
lpush archives:userid:2 2
 
發布第三微博
incr global:archives
hset archives:id:3 userid 2
hset archives:id:3 username lidong
hset archives:id:3 post_time ‘2016-06-22 17:05:40‘
hset archives:id:3 content ‘我是使用者lidong,我的第二條微博‘
lpush archives:userid:2 3
最終我們使用redis得到了與mysql一致的資料,只是redis中對應關係會有一些區別
 
二、根據具體商務邏輯,合理設定失效時間
 
三、高頻,低頻資料要分離
高頻率查詢的資料存入redis緩衝,低頻資料不要存入redis緩衝
 
四、合理使用redis的資料類型
例如:
1.使用hash類型:
hset archives:id:1 userid 1
hset archives:id:1 username dongzi
我們使用hash類型來儲存,可以達到類似mysql中一條資料中的資訊,這樣redis中每條資訊就只有一個key,能夠大量的減少key的數量
2.使用list類型
lpush archives:userid:2 3
建立一個key,list類型來表示userid為2的所有發布的微博id,這樣就可以將微博id與使用者id綁定了
 
五、盡量使用字串格式
商務邏輯滿足,盡量使用字串格式,讀取時也方便讀取查看
 
六、可以使用incr實現自增id來達到類似mysql的auto_increment功能
例如:
incr global:user 
每次incr一下自增一次,插入新資料的時候帶上這個自增後的id值
 
七、合理設定key的格式
優點:這樣的好處就是方便體現資料之間的關係,有層次化,方便管理。
例如:
set user:userid:2:username lidong
表名放在第一位,使用者id放在第二位,需要查詢的欄位放在第三位,然後使用冒號拼接凸顯出邏輯關係,這個只是根據上面的表設計的,具體商務邏輯具體實現。
 
八、建立一個“冗餘”的key來反查資料
例如:
set user:username:lidong:userid 2
設定這個key是為了利用使用者名稱來反查使用者id,我們知道使用者名稱為lidong就可以知道使用者id為2,相應的就可以擷取使用者id為2的所有資訊
 
redis使用總結