標籤:
一、利用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使用總結