Golang中Redis的使用
Redis的基本操作
1.添加key-val
2.切换数据库
3.查看数据库当前的数据库key-val 数量 dbsize
4.清空数据库 flushdb flushall
Redis的五大数据类型
Redis的五大数据类型是: String(字符串)、Hash (哈希)、List(列表)、Set(集合)和zset(sorted set:有序集合)
String(字符串)
string是redis最基本的类型,一个key对应一个value.
string类型是二进制安全的。除普通的字符串外,也可以存放图片等数据。
redis中字符串value最大是512M
set
del
setex
mset
mget
Hash(哈希)
Redis hash是一个键值对集合。var user1 map[string]string
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
Hash 的key 不能重复
hset/hget
hgetall
hdel
hmset/hmget
hlen
hexists
List(列表)
列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
List本质是个链表, List的元素是有序的,元素的值可以重复.
lpush/lrange
lpush往左边加入数据
0 表示第一个,-1 表示倒数第一个。
rpush
rpush往右边加入数据
lpop/rpop
del
llen
lindex
按照索引下标获得元素(从左到右,编号从0开始.
Set(集合)
Redis的Set是string类型的无序集合。
底层是HashTable数据结构,Set也是存放很多字符串元素
字符串元素是无序的,而且元素的值不能重复
sadd/smembers
sismember
判断是否存在
srem
删除
Golang操作Redis
将https://github.com/gomodule/redigo.git 克隆到 GOPATH的src路径下
操作string
通过go 向 redis 写入数据 和 读取数据 key -value
package main
import (
"fmt"
"redigo/redis"
)
func main() {
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("redis Dial err = ", err)
return
}
defer conn.Close()
_, err = conn.Do("Set", "name", "tom")
if err != nil {
fmt.Println("redis set err = ", err)
return
}
fmt.Println("操作成功")
r, err := redis.String(conn.Do("Get", "name"))
if err != nil {
fmt.Println("redis set err = ", err)
return
}
fmt.Println("操作成功", r)
}
操作Hash
package main
import (
"fmt"
"redigo/redis"
)
func main() {
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("redis Dial err = ", err)
return
}
defer conn.Close()
_, err = conn.Do("HSet", "user01", "name", "john")
if err != nil {
fmt.Println("redis hset err = ", err)
return
}
_, err = conn.Do("HSet", "user01", "age", 10)
if err != nil {
fmt.Println("redis hset err = ", err)
return
}
fmt.Println("操作成功")
r1, err := redis.String(conn.Do("HGet", "user01", "name"))
if err != nil {
fmt.Println("redis hget err = ", err)
return
}
r2, err := redis.String(conn.Do("HGet", "user01", "age"))
if err != nil {
fmt.Println("redis hget err = ", err)
return
}
fmt.Printf("操作成功,r1 = %v r2 = %v \n", r1, r2)
}
package main
import (
"fmt"
"redigo/redis"
)
func main() {
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("redis Dial err = ", err)
return
}
defer conn.Close()
_, err = conn.Do("HMSet", "user04", "name", "john", "age", 100)
if err != nil {
fmt.Println("redis hmset err = ", err)
return
}
fmt.Println("操作成功")
r1, err := redis.Strings(conn.Do("HMGet", "user04", "name", "age"))
if err != nil {
fmt.Println("redis hmget err = ", err)
return
}
for i, v := range r1 {
fmt.Printf("r[%d] = %v \n", i, v)
}
}
Redis连接池
- 事先初始化一定数量的链接,放入到链接池
- 当Go需要操作Redis时,直接从Redis链接池取出链接即可。
- 这样可以节省临时获取Redis链接的时间,从而提高效率.
package main
import (
"fmt"
"redigo/redis"
)
func main() {
conn := pool.Get()
defer conn.Close()
_, err := conn.Do("set", "name", "tom")
if err != nil {
fmt.Println("conn.do err = ", err)
return
}
r, err := redis.String(conn.Do("get", "name"))
if err != nil {
fmt.Println("err = ", err)
return
}
fmt.Println(r)
}
var pool *redis.Pool
func init() {
pool = &redis.Pool{
MaxIdle: 8,
MaxActive: 0,
IdleTimeout: 100,
Dial: func() (redis.Conn, error) {
return redis.Dial("tcp", "localhost:6379")
},
}
}
|