Redis介绍
Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据结构,很多业务场景下的问题都可以很自然地映射到这些数据结构上。除此之外,通过复制、持久化和客户端分片等特性,我们可以很方便地将Redis扩展成一个能够包含数百GB数据、每秒处理上百万次请求的系统。
Redis支持的数据结构
Redis支持诸如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、带范围查询的排序集合(sorted sets)、位图(bitmaps)、hyperloglogs、带半径查询和流的地理空间索引等数据结构(geospatial indexes)。
Redis应用场景
缓存系统,减轻主数据库(MySQL)的压力。
计数场景,比如微博、抖音中的关注数和粉丝数。
热门排行榜,需要排序的场景特别适合使用ZSET。
利用LIST可以实现队列的功能。
Redis与Memcached比较
Memcached中的值只支持简单的字符串,Reids支持更丰富的5中数据结构类型。 Redis的性能比Memcached好很多 Redis支持RDB持久化和AOF持久化。 Redis支持master/slave模式。
redis下载安装
redis下载地址:https://github.com/MicrosoftArchive/redis/releases
go-redis下载地址:https://github.com/go-redis/redis(不推荐)
redisgo下载地址:https://github.com/garyburd/redigo(推荐)
直接解压就能使用
cli是客户端,server是服务器
先启动服务器,再启动客户端,客户端如下图则启动成功
redis默认端口6379,启动服务会默认启动编号为0-15的16个数据库
Redis常用命令
命令大全中文文档连接:http://redisdoc.com/
1、储存获取数据
//向数据库中插入一个字符串,默认插在0库中 成功打印OK
set testkey hello,world!
//从数据库取出一条数据,会显示 “hello,world!”
get testkey
//设置一条数据在数据库中保存10秒
setex testkey 10 hello,world
//一次插入多条数据,相应的一次性获取多条数据 mget
mset key1 value1 key2 value2
//查看所有
keys *
2、部分数据库操作
//切换到数据库2
select 2
//查看数据库内容有多少条
dbsize
//清除当前数据中的所有内容
flushdb
//清空所有数据库的内容
flushall
3、哈希操作
redis中的hash更像是一个结构体,我们可以进行如下操作
//添加一个人员,标明他的名字,年龄,工作
hset user name wd
hset user age 22
hset user job golang
//获取数据使用相应的hget,如下
hget user name
//一次添加多个信息
hmset user1 name wd age 22 job golang
//一次性获取多个信息
hmget user1 name age job
//也可以用 hgetall
hgetall user1
//查看哈希中有多少条数据
hlen user1
//判断哈希中是否含有某个字段
hexisti user1 name
4、列表
//创建一个城市的列表,从前面添加,从后面添加使用rpush关键字
lpush city beijing tianjin shanghai
//查看列表 lrange 列表名字 起始位置 终止位置 -1相当于倒数第一个
lrange city 0 -1
//从左边去除出一个数据,lpop,从右边取出数据rpop,数据取出后,列表中该数据删除了
lpop city
//删除一个列表 del
del city
5、集合
无序,不可重复,
//创建一个集合,添加一些信息
sadd emails 111@qq.com 222@qq.com
//查看集合里面的所有内容
smembers emails
//查看集合中是否含有某个值
sismember emails 111@qq.com
//移除集合中的一个值
srem emails 111@qq.com
go语言操作redis
首先看一个简单的例子
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
//WDShowError ..打印错误函数
func WDShowError(err error) bool {
if err != nil {
fmt.Println(err)
return true
}
return false
}
func main() {
//连接到redis服务器,用法就像tcp
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if WDShowError(err) {
return
}
//函数结束时关闭
defer conn.Close()
//插入一条数据
_, err = conn.Do("set", "name", "wd")
if WDShowError(err) {
return
}
//读取数据并打印,此处注意用redis自带的方法进行格式转换
res, err := redis.String(conn.Do("get", "name"))
if WDShowError(err) {
return
}
fmt.Println(res)
}
操作hashes
按照上面的例子,操作hashas是不是同样简单
//插入数据
_, err = conn.Do("hmset", "user1", "name", "wd", "age", "22")
if WDShowError(err) {
return
}
//读取数据
res, err := redis.Strings(conn.Do("hgetall", "user1"))
if WDShowError(err) {
return
}
我们现在给这个哈希设置一个存在时间
//十秒钟后哈希user1消失
res, err := conn.Do("expire", "user1", 10)
if WDShowError(err) {
return
}
列表的操作
//打印错误函数
func WDShowError(err error) bool {
if err == redis.ErrNil {
return true
} else if err != nil {
fmt.Println(err)
return true
}
return false
}
//插入数据
_, err = conn.Do("lpush", "student", "wd", "zjd", "wyh")
if WDShowError(err) {
return
}
//查看全部数据
res, err := redis.Strings(conn.Do("lrange", "student", 0, -1))
if WDShowError(err) {
return
}
fmt.Println(res)
//循环取出数据,
for {
s, err := redis.String(conn.Do("rpop", "student"))
if WDShowError(err) {
break
}
fmt.Println(s)
}
redis的连接池实现
1、声明一个连接池对象
2、初始化这个链接对象
3、从连接池中取出一个连接进行操作
4、关闭连接池
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
//定义一个全局连接池
var redpool *redis.Pool
//初始化
func init() {
redpool = &redis.Pool{
MaxIdle: 8, //最大空闲链接数
MaxActive: 0, //最大连接数 0表示没有限制
IdleTimeout: 100, //最大空闲时间
Dial: func() (redis.Conn, error) { //初始化连接代码
rd, err := redis.Dial("tcp", "127.0.0.1:6379")
if wdlog.WDShowError(err) {
return nil, err
}
_, err = rd.Do("auth", "")
if wdlog.WDShowError(err) {
rd.Close()
return nil, err
}
return rd, nil
},
//每分钟验证链接,不通过自动关闭
TestOnBorrow: func(conn redis.Conn, t time.Time) error {
if time.Since(t) < time.Minute {
return nil
}
_, err := conn.Do("ping")
if wdlog.WDShowError(err) {
return err
}
return nil
},
}
}
//WDShowError ..打印错误函数
func WDShowError(err error) bool {
if err == redis.ErrNil {
return true
} else if err != nil {
fmt.Println(err)
return true
}
return false
}
func main() {
//取出一个连接
conn := redpool.Get()
defer conn.Close()
_, err := conn.Do("sadd", "qq", "11111", "22222", "333333")
if WDShowError(err) {
return
}
res, err := redis.Strings(conn.Do("smembers", "qq"))
if WDShowError(err) {
return
}
fmt.Println(res)
}
Redis设置密码
首先修改配置文件,在requirepass 后面设置密码
这两个中的一个,他们是一模一样的。
#requirepass foobared
requirepass 123 //注意,行前不能有空格
然后命令行启动redis,注意后面的文件换成你修改的那个文件
redis-server.exe ./redis.windows.conf
在客户端中输入登录密码
auth 123
未完待续。。。