Go中的redis

240 阅读3分钟

这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战

redis

redis是一种NoSQL数据库, key-value存储方式. 数据都保存在内存中, 也称为缓存型数据库或内存型数据库.

redis是用C语言编写的开源的数据. 一般和MySQL配合使用, 用于一些数据的缓存, 来缓解MySQL数据库的压力.

特性

  1. 支持持久化. 可以定时将内存中的数据保存到硬盘中, 启动redis的时候, 再从硬盘中将数据读入内存
  2. redis不单单支持string类型的数据, 还支持hash, list, set, zset五种类型的数据
  3. redis支持数据的备份

应用场景

常用用于数据缓存

session共享

购物车功能

队列系统等场景

安装redis数据库

 brew install redis

安装go-redis代码库

 go get -u github.com/go-redis/redis

set操作

将一条数据加入redis, key为字符串类型, value为空接口类型, expiration为过期时间, 如果为0则代表这个key存储的数据永不过期, 返回值StatusCmd存储了命令的执行结果

 func (c *cmdable) Set(key string, value interface{}, expiration time.Duration) *StatusCmd
 func setData()  {
    // 存储姓名
    err := cli.Set("name", "shaosiming", 0).Err()
    if err != nil {
       fmt.Println(" redis set name failed: ", err)
       return
    }
    fmt.Println("redis set name succeed!")
 ​
    // 存储年龄
    err = cli.Set("age", 18, 0).Err()
    if err != nil {
       fmt.Println(" redis set age failed: ", err)
       return
    }
    fmt.Println("redis set age succeed!")
 }

appen操作

向redis中key所对应的value值拼接数据. 如果key存在, 则将value值追加到value上. 如果key不存在, 则创建一条数据存入redis

 func (c *cmdable) Append(key, value string) *IntCmd
 func appendData() {
    // 追加值
    n, err := cli.Append("addr", "16号").Result()
    if err != nil {
       fmt.Println("redis append failed: ", err)
       return
    }
    fmt.Println("redis append succeed! - ", n)
 ​
    res, err := cli.Get("addr").Result()
    if err != nil {
       fmt.Println("redis get addr failed: ", err)
       return
    }
    fmt.Println("redis get addr succeed! - ", res)
 }

get操作

通完key获取value. 如果key不存在, 返回nil

 func (c *cmdable) Get(key string) *StringCmd
 func getData()  {
    // 获取姓名
    res, err := cli.Get("name").Result()
    if err != nil {
       fmt.Println("redis get name failed: ", err)
       return
    }
    fmt.Println("redis get name succeed!")
 ​
    // 输出数据
    fmt.Println(res)
 ​
    // 获取年龄
    res, err = cli.Get("age").Result()
    if err != nil {
       fmt.Println("redis get age failed: ", err)
       return
    }
    fmt.Println("redis get age succeed!")
 ​
    // 输出数据
    fmt.Println(res)
 }

mset操作

一次向redis中添加多个键值, 参数为k1, v1, k2, v2, ...

func (c *cmdable) MSet(pairs ...interface{}) *StatusCmd
func msetData() {
   err := cli.MSet("name", "tianming", "age", 18, "addr", "class first").Err()
   if err != nil {
      fmt.Println("redis mset failed: ", err)
      return
   }
   fmt.Println("redis mset succeed!")
}

mget操作

一次从redis中获取多个值, 参数为: k1, k2, ...

func (c *cmdable) MGet(keys ...string) *SliceCmd
func mgetData()  {
   s, err := cli.MGet("name", "age", "addr").Result()
   if err != nil {
      fmt.Println("redis mget failed: ", err)
      return
   }
   fmt.Println("redis mget succeed!")

   // 遍历数据
   for _, o := range s {
      fmt.Println(o)
   }
}

keys操作

通过正则表达式的方式redis中获取key, 比如通过*获取所有的key

func (c *cmdable) Keys(pattern string) *StringSliceCmd
func keysData()  {
   keys, err := cli.Keys("*").Result()
   if err != nil {
      fmt.Println("get all keys failed: ", err)
      return
   }
   fmt.Println("get all keys succeed!")
   for i, key := range keys {
      fmt.Println(i, ": ", key)
   }
}

exists操作

判断key是否存在, 存在返回1, 不存在返回0

func (c *cmdable) Exists(keys ...string) *IntCmd
func existsData()  {
   ret, err := cli.Exists("name").Result()
   if err != nil {
      fmt.Println("redis exists failed: ", err)
      return
   }
   fmt.Println("key name isExists: ", ret)

   ret, err = cli.Exists("gender").Result()
   if err != nil {
      fmt.Println("redis exists failed: ", err)
      return
   }
   fmt.Println("key gender isExists: ", ret)
}

expire操作

设置key的过期时间, 过期时间为time.Duration类型,

func (c *cmdable) Expire(key string, expiration time.Duration) *BoolCmd

获取key还剩多长时间过期

func (c *cmdable) TTL(key string) *DurationCmd
func expireData()  {
   err := cli.Set("tel", "18612344321", 0).Err()
   if err != nil {
      fmt.Println("redis set failed: ", err)
   }
   ret, err := cli.Expire("tel", time.Second * 20).Result()
   if err != nil {
      fmt.Println(" redis Expire failed: ", err)
      return
   }
   fmt.Println("redis Expire isSuccess: ", ret)

   td, err := cli.TTL("tel").Result()
   if err != nil {
      fmt.Println(" redis TTL failed: ", err)
      return
   }
   fmt.Println("key tel TTL: ", td)
}