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)
	}
}