当前位置: 移动技术网 > IT编程>脚本编程>Go语言 > go-redis

go-redis

2019年11月23日  | 移动技术网IT编程  | 我要评论
redis Redis 基本介绍 redis是nosql型数据库,不是传统的数据库,性能很高,适合做缓存也适合做出持久化,,完全开源免费,高性能的分布式内存数据库,,基于内存运行,并支持持久化,,最热门的nosql数据库之一,也称为数据结构服务器。 redis 两种安装方式,压缩包型,和,安装文件型 ...

redis

redis 基本介绍

redis是nosql型数据库,不是传统的数据库,性能很高,适合做缓存也适合做出持久化,,完全开源免费,高性能的分布式内存数据库,,基于内存运行,并支持持久化,,最热门的nosql数据库之一,也称为数据结构服务器。

redis

两种安装方式,压缩包型,和,安装文件型,比较简单,
若为压缩包型:redis.server启动服务,窗口不关,redis.client,客户端操作数据;

redis 的操作指令一览

指令[http://redisdoc.com/]

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(字符串) -介绍

string 是 redis 最基本的类型,一个 key 对应一个 value。
string 类型是二进制安全的。除普通的字符串外,也可以存放图片等数据redis 中字符串 value 最大是 512m

举例,存放一个地址信息:
address 北京天安门
说明 :
key : address
value: 北京天安门

string(字符串) -crud
举例说明 redis 的 string 字符串的 crud 操作.
set[如果存在就相当于修改,不存在就是添加]/get/del

string(字符串)-使用细节和注意事项

setex(set with expire)键秒值(10s后,数据消失)
mset[同时设置一个或多个 key-value 对]
mget[同时获取多个 key-val]

hash (哈希,类似 golang 里的 map)-介绍

基本的介绍
redis hash 是一个键值对集合。var user1 map[string]string
redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对

举例,存放一个 user 信息:(user1)

user1 name "smith" age 30 job "golang coder"
说明 :
key : user1
name 张三 和 age 30 就是两对 field-value

hash(哈希,类似 golang 里的 map)-crud

举例说明 redis 的 hash 的 crud 的基本操作.
hset/hget/hgetall/hdel
演示添加 user 信息的案例 (name,age )

hash-使用细节和注意事项

在给 user 设置 name 和 age 时,前面我们是一步一步设置,使用 hmset和 hmget 可以一次性来设
置多个 filed 的值和返回多个 field 的值 。
hlen 统计一个 hash 有几个元素.
hexists key field
查看哈希表 key 中,给定域 field 是否存在

list(列表)-介绍

列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列
表的头部(左边)或者尾部(右边)。

list 本质是个链表, list 的元素 是有序的,元素的值可以重复.

举例, 存放多个地址信息:
city 北京 天津 上海
说明 :
key : city
北京 天津 上海 就是三个元素

list(列表)-crud(类似于管道)

举例说明 redis 的 list 的 crud 操作。
lpush/rpush/lrange/lpop/rpop/del/

list-使用细节和注意事项

1) 按索引获取元素
2) llen key 获取长度,若key不存在,key被解释为一个空列表,返回0
3) list可以左插和右插
4) 若全部移除,对应的键就消失了

set(集合) - 介绍

redis 的 set 是 string 类型的无序集合。
底层是 hashtable 数据结构, set 也是存放很多字符串元素,字符串元素是无序
的,而且元素的值不能重复

举例,存放多个邮件列表信息:
email sgg@sohu.com tom@sohu.com
说明 :
key : emailtn@sohu.com tom@sohu.com 就是二个元素
redis>sadd email xx xxx

set(集合)- crud

举例说明 redis 的 set 的 crud 操作.

sadd
smembers[取出所有值]
sismember[判断值是否是成员]
srem [删除指定值]

以上基本操作的命令

127.0.0.1:6379> dbsize
(integer) 4
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> setx name 10 hello,go
(error) err unknown command 'setx'
127.0.0.1:6379> setex name 10 hello,go
ok
127.0.0.1:6379> get name
"hello,go"
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> setex name 10 hello,go
ok
127.0.0.1:6379> get name
"hello,go"
127.0.0.1:6379> get name
"hello,go"
127.0.0.1:6379> get name
"hello,go"
127.0.0.1:6379> get name
"hello,go"
127.0.0.1:6379> get name
"hello,go"
127.0.0.1:6379> get name
"hello,go"
127.0.0.1:6379> get name
"hello,go"
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> mset name a name2 b
ok
127.0.0.1:6379> get name
"a"
127.0.0.1:6379> get name2
"b"
127.0.0.1:6379> dbsize
(integer) 4
127.0.0.1:6379> get user01
(error) wrongtype operation against a key holding the wrong kind of value
127.0.0.1:6379> hget user01
(error) err wrong number of arguments for 'hget' command
127.0.0.1:6379> hset use1 name "ygj"
(integer) 1
127.0.0.1:6379> hset use1 age 20
(integer) 1
127.0.0.1:6379> hget user1
(error) err wrong number of arguments for 'hget' command
127.0.0.1:6379> hget user1 name
(nil)
127.0.0.1:6379> hget use1 name
"ygj"
127.0.0.1:6379> hget use1 age
"20"
127.0.0.1:6379> hgetall use1
1) "name"
2) "ygj"
3) "age"
4) "20"
127.0.0.1:6379> hget user01 name
"john"
127.0.0.1:6379> desize
(error) err unknown command 'desize'
127.0.0.1:6379> dbsize
(integer) 5
127.0.0.1:6379> hlen user01
(integer) 2
127.0.0.1:6379> hlen usel1
(integer) 0
127.0.0.1:6379> hlen use1
(integer) 2
127.0.0.1:6379> lpush city a b c d
(integer) 4
127.0.0.1:6379> lrange city 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lrange city 0 2
1) "d"
2) "c"
3) "b"
127.0.0.1:6379> rpush e f g
(integer) 2
127.0.0.1:6379> lrange city 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> rpush city e f g
(integer) 7
127.0.0.1:6379> lrange city 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
5) "e"
6) "f"
7) "g"
127.0.0.1:6379> del e
(integer) 1
127.0.0.1:6379> lrang e 0 -1
(error) err unknown command 'lrang'
127.0.0.1:6379> rrange city 0 -1
(error) err unknown command 'rrange'
127.0.0.1:6379> lrange city 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
5) "e"
6) "f"
7) "g"
127.0.0.1:6379> desize
(error) err unknown command 'desize'
127.0.0.1:6379> dbsize
(integer) 6
127.0.0.1:6379> sadd emals 179@qq.com
(integer) 1
127.0.0.1:6379> sadd emals 156@qq.com
(integer) 1
127.0.0.1:6379> smembers emals
1) "179@qq.com"
2) "156@qq.com"
127.0.0.1:6379> sismember emals 179@qq.com
(integer) 1
127.0.0.1:6379> sismember emals 179@qq.co
(integer) 0
127.0.0.1:6379> srem emals 179@qq.com
(integer) 1
127.0.0.1:6379> smembers emals
1) "156@qq.com"

golang 操作 redis

安装第三方开源 redis 库

1) 使用第三方开源的 redis 库: github.com/garyburd/redigo/redis
2) 在使用 redis 前,先安装第三方 redis 库,在 gopath 路径下执行安装指令:
d:\goproject>go get github.com/garyburd/redigo/redis

特别说明: 在安装 redis 库前,确保已经安装并配置了 git, 因为 是从 github 下载安装 redis 库的,
需要使用到 git。 如果没有安装配置过 git,请参考: 如何安装配置 git

set/get 接口

说明: 通过 golang 添加和获取 key-value 【比如 name-tom~ 】

package main
import (
    "fmt"
    "github.com/garyburd/redigo/redis" //引入redis包
)

func main() {
    //通过go 向redis 写入数据和读取数据
    //1. 链接到redis
    conn, err := redis.dial("tcp", "127.0.0.1:6379")
    if err != nil {
        fmt.println("redis.dial err=", err)
        return 
    }
    defer conn.close() //关闭..

    //2. 通过go 向redis写入数据 string [key-val]
    _, err = conn.do("set", "name", "tomjerry猫猫")
    if err != nil {
        fmt.println("set  err=", err)
        return 
    }

    //3. 通过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 ,因此我们需要转换
    //namestring := r.(string)

    fmt.println("操作ok ", r)
}

操作 hash

package main
import (
    "fmt"
    "github.com/garyburd/redigo/redis" //引入redis包
)

func main() {
    //通过go 向redis 写入数据和读取数据
    //1. 链接到redis
    conn, err := redis.dial("tcp", "127.0.0.1:6379")
    if err != nil {
        fmt.println("redis.dial err=", err)
        return 
    }
    defer conn.close() //关闭..

    //2. 通过go 向redis写入数据 string [key-val]
    _, err = conn.do("hset", "user01", "name", "john")
    if err != nil {
        fmt.println("hset  err=", err)
        return 
    }

    _, err = conn.do("hset", "user01", "age", 18)
    if err != nil {
        fmt.println("hset  err=", err)
        return 
    }

    //3. 通过go 向redis读取数据 

    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 ,因此我们需要转换
    //namestring := r.(string)

    fmt.printf("操作ok r1=%v r2=%v \n", r1, r2)
}

操作多个数据

package main
import (
    "fmt"
    "github.com/garyburd/redigo/redis" //引入redis包
)

func main() {
    //通过go 向redis 写入数据和读取数据
    //1. 链接到redis
    conn, err := redis.dial("tcp", "127.0.0.1:6379")
    if err != nil {
        fmt.println("redis.dial err=", err)
        return 
    }
    defer conn.close() //关闭..

    //2. 通过go 向redis写入数据 string [key-val]
    _, err = conn.do("hmset", "user02", "name", "john", "age", 19)
    if err != nil {
        fmt.println("hmset  err=", err)
        return 
    }



    //3. 通过go 向redis读取数据 

    r, err := redis.strings(conn.do("hmget","user02", "name", "age"))
    if err != nil {
        fmt.println("hget  err=", err)
        return 
    }
    for i, v := range r {
        fmt.printf("r[%d]=%s\n", i, v)
    }

}

与此类似集合也可以这样操作

给数据设置有效时间

说明: 通过 golang 对 redis 操作,给 key-value 设置有效时间
核心代码:

//给 name 数据设置有效时间为 10s
_, err = c.do("expire", "name", 10)

操作 list

说明: 通过 golang 对 redis 操作 list 数据类型

核心代码:

_, err = c.do("lpush", "herolist", "no1: 宋江", 30, "no2: 卢俊义", 28)
r, err := redis.string(c.do("rpop", "herolist"))

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的redis
        return redis.dial("tcp", "localhost:6379")
        },
    }   

}

func main() {
    //先从pool 取出一个链接
    conn := pool.get()
    defer conn.close()

    _, err := conn.do("set", "name", "汤姆猫~~")
    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)

    //如果我们要从pool 取出链接,一定保证链接池是没有关闭
    // pool.close()
    conn2 := pool.get()

    _, err = conn2.do("set", "name2", "汤姆猫~~2")
    if err != nil {
        fmt.println("conn.do err~~~~=", err)
        return
    }

    //取出
    r2, err := redis.string(conn2.do("get", "name2"))
    if err != nil {
        fmt.println("conn.do err=", err)
        return
    }

    fmt.println("r=", r2)

    //fmt.println("conn2=", conn2)


}

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网