0%

Gin使用Redis

QQ群:397745473

Gin使用Redis 包括

一键搭建go环境

Gin使用Redis 示例代码

Redis 配置

Redis 快速度入库

一键搭建go环境

一键搭建go1.15.15环境:

更换版本 https://go.dev/dl/

1
wget https://go.dev/dl/go1.17.6.linux-amd64.tar.gz -O golang.tar.gz;tar -zxf golang.tar.gz -C /usr/local/;echo 'export GOROOT=/usr/local/go' >> /etc/profile;echo 'export GOPATH=$HOME/go'>> /etc/profile;echo 'export PATH=$PATH:$GOROOT/bin:$GOPATH/bin' >> /etc/profile;source /etc/profile

golang 编码

1
2
3
# go mod init test # 在新的 go 项目中执行,自动分析依赖,创建 go.sum
# go mod tidy # 自动分析依赖,并自动添加和删除依赖
# go run main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package main

import (
"flag"
"fmt"
"github.com/garyburd/redigo/redis"
"github.com/gin-gonic/gin"

"net/http"
)

var port string
var pwd string
var pool *redis.Pool //创建redis连接池

func init() {
pool = &redis.Pool{ //实例化一个连接池
MaxIdle: 16, //最初的连接数量
// MaxActive:1000000, //最大连接数量
MaxActive: 0, //连接池最大连接数量,不确定可以用0(0表示自动定义),按需分配
IdleTimeout: 300, //连接关闭时间 300秒 (300秒不使用自动关闭)
Dial: func() (redis.Conn, error) { //要连接的redis数据库
return redis.Dial("tcp", "localhost:6379")
},
}
}

func main() {
flag.StringVar(&port, "P", "80", "port,default 80")
flag.StringVar(&pwd, "PWD", "JMqU25yVuS8cDd0B", "password,default JMqU25yVuS8cDd0B")
flag.Parse()
apiServer := gin.New()
apiServer.GET("/", Index)
apiServer.GET("/hello", HelloWorldGet)
apiServer.POST("/hello", HelloWorldPost)
portString := fmt.Sprintf(":%s", port)
apiServer.Run(portString)
}

func Index(context *gin.Context) {
indexHtml := `<!DOCTYPE html>
<html>
<title>submit Relut</title>
<h1>Submit Relut</h1>
<form action="/hello" method="post">
saveKey:<input type="text" name="saveKey"><br>
Relut:<input type="text" name="result"><br>
<input type="submit" value="submit">
</form>
</html>`
context.Header("Content-Type", "text/html; charset=utf-8")
context.String(http.StatusOK, indexHtml)
}

// 获取数据
func HelloWorldGet(context *gin.Context) {
// https://github.com/fang2329/learning/blob/master/redis_test/redis_set.go
// http://144.202.43.70/hello?key=20210210_domain&num=100&pwd=JMqU25yVuS8cDd0B
getKey := context.Query("key")
passwd := context.Query("pwd")
ip := context.ClientIP()
if passwd != pwd {
context.IndentedJSON(http.StatusBadRequest, gin.H{
"Error": "PASSWD",
"IP": ip,
})
return
}

//c, err := redis.Dial("tcp", "127.0.0.1:6379")
//if err != nil {
// fmt.Println("redis connect failed", err.Error())
//}
// fmt.Println(reflect.TypeOf(c))
c := pool.Get() //从连接池,取一个链接
defer c.Close()
ret, err := c.Do("SPOP", getKey, context.Query("num"))
if err != nil {
fmt.Printf("Ip: %s,srandmember get failed.\n", ip)
} else {
fmt.Printf("Ip: %s srandmember get value is:%s\n", ip, ret)
}

num, err := c.Do("scard", getKey)
if err != nil {
fmt.Println("scard error", err.Error())
} else {
fmt.Println("scard get num :", num)
}

context.IndentedJSON(http.StatusOK, gin.H{
"domain": fmt.Sprintf("%s", ret),
"num": num,
})
}

// 保存数据
func HelloWorldPost(context *gin.Context) {
result := context.PostForm("result")
key := context.PostForm("saveKey")
ip := context.ClientIP()
c := pool.Get()
defer c.Close()

_, err := redis.Int(c.Do("sadd", key, result))
//_, err = c.Do("sadd", key, result)
if err != nil {
fmt.Println("set add failed", err.Error())
} else {
fmt.Printf("Ip: %s,add Data Success.\n", ip)
}

num, err := c.Do("scard", key)
if err != nil {
fmt.Println("scard error", err.Error())
} else {
fmt.Println("scard get num :", num)
}

context.JSON(http.StatusOK, gin.H{
"success": num,
})

}

Redis 安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# redis目录规划:
下载目录: /data/soft/
安装目录: /opt/redis_cluster/redis_{PORT}/{conf,logs,pid}
数据目录: /data/redis_cluster/redis_{PORT}/redis_{PORT}.rdb
运维脚本: /root/script/redis_shell.sh


安装命令:
apt-get install gcc make
mkdir -p /data/redis_cluster/redis_6379
mkdir -p /opt/redis_cluster/redis_6379/{conf,logs,pid}
mkdir /data/soft/;cd /data/soft/;wget https://download.redis.io/releases/redis-6.2.6.tar.gz;tar xf redis-6.2.6.tar.gz -C /opt/redis_cluster/
ln -s /opt/redis_cluster/redis-6.2.6/ /opt/redis_cluster/redis
cd /opt/redis_cluster/redis
make
make install
#出错时用cd src; make MALLOC=libc
* redis-6.2.6/utils/install_server.sh 可生成conf 的配置文件

Redis 配置文件

精简配置文件 /opt/redis_cluster/redis_6379/conf/redis_6379.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 以守护进程模式启动
daemonize yes
# 绑定的主机地址
bind 127.0.0.1
# 监听的端口
port 6379
# pid文件和log文件的保存地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
# 设置数据库的数量,默认数据库为0
databases 16
# 指定本地持久化的文件名,默认是dump.rdb
dbfilename redis_6379.rdb
# 本地数据库的目录
dir /data/redis_cluster/redis_6379
#开启RDB持久化
save 900 1
save 300 10
save 60 10000
# 内存
#maxmemory 2gb
#maxmemory-policy allkeys-lru

其他参考:

1
2
3
4
5
6
7
8
9
10
11
# 内存报错参考 https://codeantenna.com/a/9r7C3jfwpF
# https://ithelp.ithome.com.tw/articles/10239199?sc=iThelpR
# sysctl -p /etc/sysctl.conf

#启动:
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
cat /opt/redis_cluster/redis_6379/logs/redis_6379.log

# 关闭 redis
redis-cli
127.0.0.1:6379> SHUTDOWN

Redis 快速入库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 文件转redis命令: sed -i 's/^/sadd domain /'  filename
# for f in `ls res_copy/`;do sed -i 's/[A-Z]/\l&/g' res_copy/$f; sed -i 's/^/sadd 20220210_domain /' res_copy/$f;done

# 入库cat alexa | redis-cli --pipe apt-get install unix2dos
# 127.0.0.1:6379> config set stop-writes-on-bgsave-error no
# cat res_copy/domcop | redis-cli --pipe
# for f in `ls res_copy/`;do echo $f;unix2dos res_copy/$f;cat res_copy/$f | redis-cli --pipe ;done


# 查询
# 统计 127.0.0.1:6379> SCARD 20220209domain
# 取键 127.0.0.1:6379> KEYS *
# 命名 127.0.0.1:6379> RENAME domain 20220209domain
# 获取 127.0.0.1:6379> SPOP 20220209domain 100
# 并集 127.0.0.1:6379> SUNIONSTORE 20220210domain 20220209domain
# 删除 127.0.0.1:6379> DEL 20220210domain

# SMEMBERS key 返回集合 key 中的所有成员。
# SPOP key 移除并返回集合中的一个随机元素。
# 参考 http://redisguide.com/set.html
# 参考 http://redisdoc.com/string/set.html
# 参考 https://codeantenna.com/a/JkykwnSwg0

QQ群:397745473

欢迎关注我的其它发布渠道