Redis的使用

Stella981
• 阅读 717

一、Redis基本介绍

Redis:remote dictionary server 远程字典服务器。Redis性能非常高,单机能够达到15w qps,通常适合做缓存,也可以持久化。

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的五大数据类型:string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(sorted set 有序集合)

1、string(字符串)

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

string字符串的CRUD操作:set[如果存在就相当于修改,不存在就是添加]/get/del

setex(set with expire)键秒值

mset[同时设置一个或多个key-value对]

mget[同时获取多个key-value]

Redis的使用

2、hash(哈希,类似于golang中的map)

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

Redis的使用

3、list(列表)

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

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

Redis的使用

4、set(集合)

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

Redis的使用

三、golang操作Redis

在使用Redis之前,需要先安装第三方Redis库,在GOPATH路径下执行安装命令:go get github.com/garyburd/redigo/redis

通过golang添加和获取key-value

package main

import (
    "fmt"
    "github.com/garyburd/redigo/redis"
)

func main() {
    //通过go向redis写入和读取数据
    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", "tomjerry")
    if err != nil {
        fmt.Println("set err=", err)
        return
    }

    r, err := redis.String(conn.Do("Get", "name"))
    if err != nil {
        fmt.Println("set err=", err)
        return
    }

    //返回的r是interface{}
    fmt.Println(r)
}

 通过golang操作Redis的hash数据类型

package main

import (
    "fmt"
    "github.com/garyburd/redigo/redis"
)

func main() {
    //通过go向redis写入和读取数据
    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("hset err=", err)
        return
    }

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

    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
    }

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

对hash数据结构,field-val是批量放入和读取

package main

import (
    "fmt"
    "github.com/garyburd/redigo/redis"
)

func main() {
    //通过go向redis写入和读取数据
    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", "user02", "name", "john", "age", 19)
    if err != nil {
        fmt.Println("hmset err=", err)
        return
    }

    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)
    }
}

四、Redis链接池

通过Golang对Redis操作,还可以通过Redis链接池, 流程如下:
1、事先初始化一定数量的链接,放入到链接池
2、当Go需要操作Redis时,直接从Redis链接池取出链接即可。
3、这样可以节省临时获取Redis链接的时间,从而提高效率。

package main

import (
    "fmt"
    "github.com/garyburd/redigo/redis"
)

var pool *redis.Pool

func init() {
    pool = &redis.Pool{
        MaxIdle:     8,   //最大空闲链接数
        MaxActive:   0,   // 表示和数据库的最大链接数,0表示没有限制
        IdleTimeout: 100, // 最大空闲时间
        //初始化链接的代码, 链接哪个ip的redis
        Dial: func() (redis.Conn, error) {
            return redis.Dial("tcp", "localhost:6379")
        },
    }
}

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

    _, err := conn.Do("Set", "name", "nancy")
    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)

    conn2 := pool.Get()
    defer conn2.Close()

    _, 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)
}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这