安装redis
redis简介:
redis(REmote DIctionary Server)是一个由Salvatore Sanfilippo写key-value存储系统,它由C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value类型的数据库,并提供多种语言的API。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步,redis在3.0版本推出集群模式。
想要使用首先要安装啦,参照该博主安装,还算比较方便
https://blog.csdn.net/weixin_33446857/article/details/77893896?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
启动方式,进入自己的目录后输入
redis-server.exe redis.windows.conf
启动客户端
redis-cli
setkey和getkey
安装就结束啦,接下来到代码中实战
使用
参考:https://www.cnblogs.com/wdliu/p/9330278.html
https://blog.csdn.net/weixin_41047549/article/details/90701111?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.nonecase
使用第三方库:“github.com/garyburd/redigo/redis”->fork from “github.com/gomodule/redigo/redis”
参考文档:https://godoc.org/github.com/gomodule/redigo/redis
最基础的使用代码:
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func main() {
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("connect redis error :", err)
return
}
defer conn.Close()
// 通过conn.Do来转达命令
_, err = conn.Do("SET", "name", "wd")
if err != nil {
fmt.Println("redis set error:", err)
}
//redis.string还需学习具体含义,是获得string类型的就这样用吗
name, err := redis.String(conn.Do("GET", "name"))
if err != nil {
fmt.Println("redis get error:", err)
} else {
fmt.Printf("Got name: %s \n", name)
}
}
连接池和设置value超时时间的使用
var Pool redis.Pool
func init() { //init 用于初始化一些参数,先于main执行
Pool = redis.Pool{
MaxIdle: 16, //最大空闲连接数
MaxActive: 32, //表示和数据库的最大连接数,0表示没有限制
IdleTimeout: 120, //最大空闲时间
Dial: func() (redis.Conn, error) {
return redis.Dial("tcp", "127.0.0.1:6379")
},
}
}
func use_pool_timeout() {
//正常操作
//conn, _ := redis.Dial("tcp", "127.0.0.1:6379")
//defer conn.Close()
//连接池操作
conn := Pool.Get()
defer conn.Close()
//这样是设置了两个key,一个叫name,一个叫EX
//_, err := conn.Do("MSET", "name", "wd", "EX", "5")
//这样是设置了超时时间,为5秒
_, err := conn.Do("SET", "name", "wd", "EX", "5")
if err != nil {
fmt.Println("redis set error:", err)
}
name, err := redis.String(conn.Do("GET", "name"))
if err != nil {
fmt.Println("redis get error:", err)
} else {
fmt.Printf("Got name: %s \n", name)
}
}
func main() {
use_pool_timeout()
}
string操作
func string_redis() {
conn := Pools.Get()
defer conn.Close()
//这样是设置了两个key,一个叫name,一个叫EX
//_, err := conn.Do("MSET", "name", "wd", "EX", "5")
//这样是设置了超时时间,为5秒
_, err := conn.Do("SET", "name", "wd", "EX", "5")
if err != nil {
fmt.Println("redis set error:", err)
}
name, err := redis.String(conn.Do("GET", "name"))
if err != nil {
fmt.Println("redis get error:", err)
} else {
fmt.Printf("Got name: %s \n", name)
}
//删除key
_, err = conn.Do("DEL", "name")
if err != nil {
fmt.Println("redis get error:", err)
} else {
fmt.Println("Got name del")
}
//再次获取
name, err = redis.String(conn.Do("GET", "name"))
if err != nil {
fmt.Println("redis get error:", err)
} else {
fmt.Printf("Got name: %s \n", name)
}
}
---------------------------------------------
output:
Got name: wd
Got name del
redis get error: redigo: nil returned
list操作
- rpush(key, value):在名称为key的list尾添加一个值为value的元素
- lpush(key, value):在名称为key的list头添加一个值为value的 元素
- llen(key):返回名称为key的list的长度
- lrange(key, start, end):返回名称为key的list中start至end之间的元素
- ltrim(key, start, end):截取名称为key的list
- lindex(key, index):返回名称为key的list中index位置的元素
- lset(key, index, value):给名称为key的list中index位置的元素赋值
- lrem(key, count, value):删除count个key的list中值为value的元素
- lpop(key):返回并删除名称为key的list中的首元素
- rpop(key):返回并删除名称为key的list中的尾元素
- blpop(key1, key2,… key N, timeout):lpop命令的block版本。
- brpop(key1, key2,… key N, timeout):rpop的block版本。
- rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
类似于出入栈的操作
func list_redis() {
//正常操作
//conn, _ := redis.Dial("tcp", "127.0.0.1:6379")
//defer conn.Close()
//连接池操作
c := Poolss.Get()
defer c.Close()
_, err := c.Do("lpush", "mylist", "ofo", "mobike", "foo")
if err != nil {
fmt.Println("redis lpush failed", err.Error())
}
relist, _ := redis.Strings(c.Do("lrange", "mylist", 0, -1))
fmt.Println(relist)
_, err = c.Do("rpop", "mylist")
relist, _ = redis.Strings(c.Do("lrange", "mylist", 0, -1))
fmt.Println(relist)
_, err = c.Do("lset", "mylist", 1, "test")
relist, _ = redis.Strings(c.Do("lrange", "mylist", 0, -1))
fmt.Println(relist)
_, err = c.Do("lrem", "mylist", 3, "foo")
relist, _ = redis.Strings(c.Do("lrange", "mylist", 0, -1))
fmt.Println(relist)
}
-------------------------------------------------
output:
[foo mobike ofo test ofo test ofo test ofo test ofo mobike ofo mobike]
[foo mobike ofo test ofo test ofo test ofo test ofo mobike ofo]
[foo test ofo test ofo test ofo test ofo test ofo mobike ofo]
[test ofo test ofo test ofo test ofo test ofo mobike ofo]