Redis基础+Golang操作

Redis介绍

Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据结构,很多业务场景下的问题都可以很自然地映射到这些数据结构上。除此之外,通过复制、持久化和客户端分片等特性,我们可以很方便地将Redis扩展成一个能够包含数百GB数据、每秒处理上百万次请求的系统。

Redis支持的数据结构

Redis支持诸如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、带范围查询的排序集合(sorted sets)、位图(bitmaps)、hyperloglogs、带半径查询和流的地理空间索引等数据结构(geospatial indexes)。

Redis应用场景

缓存系统,减轻主数据库(MySQL)的压力。
计数场景,比如微博、抖音中的关注数和粉丝数。
热门排行榜,需要排序的场景特别适合使用ZSET。
利用LIST可以实现队列的功能。

Redis与Memcached比较

Memcached中的值只支持简单的字符串,Reids支持更丰富的5中数据结构类型。 Redis的性能比Memcached好很多 Redis支持RDB持久化和AOF持久化。 Redis支持master/slave模式。

redis下载安装

redis下载地址:https://github.com/MicrosoftArchive/redis/releases
go-redis下载地址:https://github.com/go-redis/redis(不推荐)
redisgo下载地址:https://github.com/garyburd/redigo(推荐)
直接解压就能使用
cli是客户端,server是服务器
在这里插入图片描述
先启动服务器,再启动客户端,客户端如下图则启动成功
在这里插入图片描述
redis默认端口6379,启动服务会默认启动编号为0-15的16个数据库

Redis常用命令

命令大全中文文档连接:http://redisdoc.com/

1、储存获取数据
//向数据库中插入一个字符串,默认插在0库中 成功打印OK
set testkey hello,world!

//从数据库取出一条数据,会显示 “hello,world!”
get testkey

//设置一条数据在数据库中保存10秒
setex testkey 10 hello,world

//一次插入多条数据,相应的一次性获取多条数据 mget
mset key1 value1 key2 value2

//查看所有
keys *
2、部分数据库操作
//切换到数据库2
select 2
//查看数据库内容有多少条
dbsize
//清除当前数据中的所有内容
flushdb
//清空所有数据库的内容
flushall
3、哈希操作

redis中的hash更像是一个结构体,我们可以进行如下操作

//添加一个人员,标明他的名字,年龄,工作 
hset user name wd
hset user age 22
hset user job golang
//获取数据使用相应的hget,如下
hget user name

//一次添加多个信息
hmset user1 name wd age 22 job golang
//一次性获取多个信息
hmget user1 name age job
//也可以用 hgetall
hgetall user1

//查看哈希中有多少条数据
hlen user1
//判断哈希中是否含有某个字段
hexisti user1 name
4、列表
//创建一个城市的列表,从前面添加,从后面添加使用rpush关键字
lpush city beijing tianjin shanghai
//查看列表 lrange 列表名字 起始位置  终止位置  -1相当于倒数第一个
lrange city 0 -1

//从左边去除出一个数据,lpop,从右边取出数据rpop,数据取出后,列表中该数据删除了
lpop city

//删除一个列表 del
del city
5、集合

无序,不可重复,

//创建一个集合,添加一些信息
sadd emails [email protected] [email protected]
//查看集合里面的所有内容
smembers emails
//查看集合中是否含有某个值
sismember emails [email protected]
//移除集合中的一个值
srem emails [email protected]

go语言操作redis

首先看一个简单的例子
package main

import (
	"fmt"

	"github.com/garyburd/redigo/redis"
)

//WDShowError ..打印错误函数
func WDShowError(err error) bool {
	if err != nil {
		fmt.Println(err)
		return true
	}
	return false
}

func main() {
	//连接到redis服务器,用法就像tcp
	conn, err := redis.Dial("tcp", "127.0.0.1:6379")
	if WDShowError(err) {
		return
	}
	//函数结束时关闭
	defer conn.Close()
	//插入一条数据
	_, err = conn.Do("set", "name", "wd")
	if WDShowError(err) {
		return
	}
	//读取数据并打印,此处注意用redis自带的方法进行格式转换
	res, err := redis.String(conn.Do("get", "name"))
	if WDShowError(err) {
		return
	}
	fmt.Println(res)
}

操作hashes

按照上面的例子,操作hashas是不是同样简单

	//插入数据
	_, err = conn.Do("hmset", "user1", "name", "wd", "age", "22")
	if WDShowError(err) {
		return
	}
	//读取数据
	res, err := redis.Strings(conn.Do("hgetall", "user1"))
	if WDShowError(err) {
		return
	}

我们现在给这个哈希设置一个存在时间

//十秒钟后哈希user1消失
	res, err := conn.Do("expire", "user1", 10)
	if WDShowError(err) {
		return
	}
列表的操作
//打印错误函数
func WDShowError(err error) bool {
	if err == redis.ErrNil {
		return true
	} else if err != nil {
		fmt.Println(err)
		return true
	}
	return false
}
    //插入数据
	_, err = conn.Do("lpush", "student", "wd", "zjd", "wyh")
	if WDShowError(err) {
		return
	}
	//查看全部数据
	res, err := redis.Strings(conn.Do("lrange", "student", 0, -1))
	if WDShowError(err) {
		return
	}
	fmt.Println(res)
	//循环取出数据,
	for {
		s, err := redis.String(conn.Do("rpop", "student"))
		if WDShowError(err) {
			break
		}
		fmt.Println(s)
	}

redis的连接池实现

1、声明一个连接池对象
2、初始化这个链接对象
3、从连接池中取出一个连接进行操作
4、关闭连接池

package main

import (
	"fmt"

	"github.com/garyburd/redigo/redis"
)

//定义一个全局连接池
var redpool *redis.Pool

//初始化
func init() {
	redpool = &redis.Pool{
		MaxIdle:     8,   //最大空闲链接数
		MaxActive:   0,   //最大连接数 0表示没有限制
		IdleTimeout: 100, //最大空闲时间
		Dial: func() (redis.Conn, error) { //初始化连接代码
			rd, err := redis.Dial("tcp", "127.0.0.1:6379")
			if wdlog.WDShowError(err) {
				return nil, err
			}
			_, err = rd.Do("auth", "")
			if wdlog.WDShowError(err) {
				rd.Close()
				return nil, err
			}
			return rd, nil
		},
		//每分钟验证链接,不通过自动关闭
		TestOnBorrow: func(conn redis.Conn, t time.Time) error {
			if time.Since(t) < time.Minute {
				return nil
			}
			_, err := conn.Do("ping")
			if wdlog.WDShowError(err) {
				return err
			}
			return nil
		},
	}
}

//WDShowError ..打印错误函数
func WDShowError(err error) bool {
	if err == redis.ErrNil {
		return true
	} else if err != nil {
		fmt.Println(err)
		return true
	}
	return false
}

func main() {
	//取出一个连接
	conn := redpool.Get()
	defer conn.Close()
	_, err := conn.Do("sadd", "qq", "11111", "22222", "333333")
	if WDShowError(err) {
		return
	}
	res, err := redis.Strings(conn.Do("smembers", "qq"))
	if WDShowError(err) {
		return
	}
	fmt.Println(res)
}

Redis设置密码

首先修改配置文件,在requirepass 后面设置密码
这两个中的一个,他们是一模一样的。
在这里插入图片描述
#requirepass foobared
requirepass 123 //注意,行前不能有空格
然后命令行启动redis,注意后面的文件换成你修改的那个文件
redis-server.exe ./redis.windows.conf

在客户端中输入登录密码
auth 123

未完待续。。。

发布了53 篇原创文章 · 获赞 5 · 访问量 2332

猜你喜欢

转载自blog.csdn.net/qq_25490573/article/details/103238848