Redis概述
redis
是業界主流的key-value
,nosql
數據庫之一。和Memcached類似,它支持存儲的value類型相對更多,包括string
(字符串)、list
(列表)、set
(集合)、zset
(sorted set --有序集合)和hash
(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
Redis優點
- 異常快速 : Redis是非常快的,每秒可以執行大約110000設置操作,81000個/每秒的讀取操作。
- 支持豐富的數據類型 : Redis支持最大多數開發人員已經知道如列表,集合,可排序集合,哈希等數據類型。
- 這使得在應用中很容易解決的各種問題,因為我們知道哪些問題處理使用哪種數據類型更好解決。
- 操作都是原子的 : 所有 Redis 的操作都是原子,從而確保當兩個客戶同時訪問 Redis 服務器得到的是更新后的值(最新值)。
- MultiUtility工具:Redis是一個多功能實用工具,可以在很多如:緩存,消息傳遞隊列中使用(Redis原生支持發布/訂閱),在應用程序中,如:Web應用程序會話,網站頁面點擊數等任何短暫的數據;
Redis應用場景
- 緩存系統,減輕主數據庫(MySQL/Maridb)的壓力
- 計數場景,比如微博、抖音中的關注數和粉絲數
- 熱門排行榜,需要排序的場景特別適合使用ZSET
- 利用LIST可以實現隊列的功能
Redis部署
1.安裝Redis環境
# linux下安裝redis
yum install redis
# mac os下安裝redis
brew install redis
2.啟動redis
# linux下啟動redis
systemctl start redis-server
# mac os下啟動redis
./usr/local/Cellar/redis/5.0.3/bin/redis-server
3.Python操作Redis
pip3 install redis
Go操作Redis
安裝
go get -u github.com/go-redis/redis
連接
package main
import (
"fmt"
"github.com/go-redis/redis"
)
// redis
var redisdb *redis.Client
func initRedis()(err error){
redisdb = redis.NewClient(&redis.Options{
Addr: "127.0.0.1:6379",
Password: "",
DB: 0,
})
_,err = redisdb.Ping().Result()
return
}
func main(){
err := initRedis()
if err != nil {
fmt.Printf("connect redis failed,err:%v",err)
return
}
fmt.Println("connect redis success!")
}
基本使用
GET/SET示例
func basicsDemo(){
// 設置key
err := redisdb.Set("t1","Jack",0).Err()
if err != nil {
fmt.Printf("redis write failed,err:%v\n",err)
return
}
// 獲取對應的key
val,err := redisdb.Get("t1").Result()
if err != nil {
fmt.Printf("get t1 failed,err:%v\n",err)
}
fmt.Println("t1",val)
val2,err := redisdb.Get("t2").Result()
// 判斷key是否存在
if err == redis.Nil {
fmt.Println("t2 does not exist")
} else if err != nil {
fmt.Printf("get t2 failed,err:%v\n",err)
return
} else {
fmt.Println("t2",val2)
}
}
ZSET示例
func redisExample2() {
zsetKey := "language_rank"
languages := []*redis.Z{
&redis.Z{Score: 90.0, Member: "Golang"},
&redis.Z{Score: 98.0, Member: "Java"},
&redis.Z{Score: 95.0, Member: "Python"},
&redis.Z{Score: 97.0, Member: "JavaScript"},
&redis.Z{Score: 99.0, Member: "C/C++"},
}
// ZADD
num, err := redisdb.ZAdd(zsetKey, languages...).Result()
if err != nil {
fmt.Printf("zadd failed, err:%v\n", err)
return
}
fmt.Printf("zadd %d succ.\n", num)
// 把Golang的分數加10
newScore, err := redisdb.ZIncrBy(zsetKey, 10.0, "Golang").Result()
if err != nil {
fmt.Printf("zincrby failed, err:%v\n", err)
return
}
fmt.Printf("Golang's score is %f now.\n", newScore)
// 取分數最高的3個
ret, err := redisdb.ZRevRangeWithScores(zsetKey, 0, 2).Result()
if err != nil {
fmt.Printf("zrevrange failed, err:%v\n", err)
return
}
for _, z := range ret {
fmt.Println(z.Member, z.Score)
}
// 取95~100分的
op := &redis.ZRangeBy{
Min: "95",
Max: "100",
}
ret, err = redisdb.ZRangeByScoreWithScores(zsetKey, op).Result()
if err != nil {
fmt.Printf("zrangebyscore failed, err:%v\n", err)
return
}
for _, z := range ret {
fmt.Println(z.Member, z.Score)
}
}