Golang中的Redis
基本介绍
1.Redis是NoSQL数据库,不是传统的关系型数据库,官网:http://redis.io/和http://redis.cn/
2.Redis:REmote Dlctionary Server (远程字典服务器),Redis性能非常高,当即能够达到15w qps,通常适合做换成,也可以持久化
3.是完全开源免费的,高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据区,是最热门的NoSql数据库之一,也称为数据结构服务器
Redis的基本使用
说明:Redis安装好后,默认有16个数据库,初始默认使用0号库,标号是0…15
1.添加key-val[set]
2.查看当前redis的所有key [keys*]
3.获取key对应的值.[get key]
4.切换redis数据库[select index]
5.如何查看当前数据库的key-val数量[dbsize]
6.清空当前数据库的key-val和清空所有数据库的key-val[flushdb flushall]
Redis数据类型和CRUD
Redis五大数据类型
Redis的五大数据类型是:string,Hash,List,Set和zset(Sorted set:有序集合)
string使用细节和注意事项
hash使用细节和注意事项
Redis hash是一个键值对集合。var user1 map[string]string
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象
list使用细节和注意事项
列表是简单的字符串列表,按照插入顺序排列。可以添加一个元素到列表的头部(左边)或者尾部(右边)
list本质是个链表,list的元素是有序的,元素的值可以重复
lpush表示从左边插入
rpush表示从右边插入
lpop/rpop表示从左边/右边弹出一个数据
LLEN key表示返回列表key的长度,如果可以不存在,则可以被解释为一个空列表,返回0
set使用细节和注意事项
Redis的set是string类型的无序集合
底层是Hash Table数据结构,set也是存放很多字符串元素,字符串元素是无序的,而且元素的值不能重复
sadd[添加]
smembers[取出所有的值]
sismenber[判断值是否是成员]
srem[删除指定值]
Go链接到Redis
可以多找找其他帖子(手动狗头)
Go操作Redis(string类型)
package main
import (
"fmt"
"github.com/garyburd/redigo/redis" //引入Redis包
)
func main() {
//通过go向Redis写书数据和读取数据
//链接到Redis
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("redis.Dial err=", err)
return
}
defer conn.Close() //关闭
//通过go向Redis写入数据string[key-val]
_, err = conn.Do("set", "name", "tom")
if err != nil {
fmt.Println("set err=", err)
return
}
//通过go向Redis读取数据 string[key-val]
r, err := redis.String(conn.Do("Get", "name"))
if err != nil {
fmt.Println("set err=", err)
return
}
//因为返回的r是interface{}
//因为name对应的值时string,因此我们需要转换
fmt.Println("操作OK", r)
}
//操作OK tom
Go操作Redis(hash类型)
package main
import (
"fmt"
"github.com/garyburd/redigo/redis" //引入Redis包
)
func main() {
//通过go向Redis写书数据和读取数据
//链接到Redis
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("redis.Dial err=", err)
return
}
defer conn.Close() //关闭
//通过go向Redis写入数据string[key-val]
_, err = conn.Do("Hset", "user01", "name", "jhon")
if err != nil {
fmt.Println("set err=", err)
return
}
_, err = conn.Do("Hset", "user01", "age", "18")
if err != nil {
fmt.Println("set err=", err)
return
}
//通过go向Redis读取数据 string[key-val]
r1, err := redis.String(conn.Do("HGet", "user01", "name"))
if err != nil {
fmt.Println("HGet err=", err)
return
}
r2, err := redis.Int(conn.Do("HGet", "user01", "age"))
if err != nil {
fmt.Println("HGet err=", err)
return
}
//因为返回的r是interface{}
//因为name对应的值时string,因此我们需要转换
fmt.Println("操作OK", r1, r2)
}
//操作OK jhon 18
Redis连接池
说明:Golang对Redis操作,还可以通过Redis链接池,
1.事先初始化一定数量的链接,放入到连接池
2.当GO需要操作Redis时,直接从Redis连接池取出链接即可
3.这样可以节省临时获取Redis链接的时间,从而提高效率
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
//定义一个全局的pool
var pool *redis.Pool
//当启动程序时,就初始化链接池
func init() {
pool = &redis.Pool{
MaxIdle: 8, //最大空闲链接数
MaxActive: 0, //表示和数据库的最大链接数,0表示没有限制
IdleTimeout: 100, //最大空闲空间
Dial: func() (redis.Conn, error) { //初始化链接代码,链接哪个ip
return redis.Dial("tcp", "localhost:6379")
},
}
}
func main() {
//先从pool取出一个链接
conn := pool.Get()
defer conn.Close()
_, err := conn.Do("set", "neme", "tome")
if err != nil {
fmt.Println("conn.Do err=", err)
return
}
//取出
r, err := redis.String(conn.Do("Get", "name"))
if err != nil {
fmt.Println("conn.Do err= ", err)
return
}
fmt.Println("r=", r)
}