Day16 大项目Redis的原理及应用 | 青训营笔记

62 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天

Redis介绍

简单概念

  • redis作为NoSql的一种,拥有NoSQL相关特点
  • redis支持数据的持久化,将内存中的数据保存到磁盘中,重启的时候可以再次加载进行使用
  • redis不仅仅支持key-value数据,还支持:string,list,set,hash等
  • redis支持数据备份,即master-slaver模式的数据备份

常见命令

通用指令是部分数据类型的,都可以使用的指令,常见的有:

  • KEYS:查看符合模板的所有key,不建议在生产环境设备上使用
  • DEL:删除一个指定的key
  • EXISTS:判断key是否存在
  • EXPIRE:给一个key设置有效期,有效期到期时该key会被自动删除
  • TTL:查看一个KEY的剩余有效期 (-1:代表永久有效)

还有其他几种数据结构操作命令参考Redis官网

go操作Redis

获取Redis连接

 func GetRedisConnection() redis.Conn {
     c, err := redis.Dial("tcp", "localhost:6379")
     if err != nil {
         fmt.Println("conn redis failed,", err)
         return nil
     }
     fmt.Println("redis conn success")
 ​
     return c
 }

Dial获取Redis连接:本地Redis使用6379端口

操作基础命令

  • Set命令
 //获取redis连接
     conn := utils.GetRedisConnection()
     if conn == nil {
         fmt.Println("获取redis连接失败")
     }
 ​
     //将token存入用户信息存入redis中
     token := utils.RandString(32)
     userJson, err := json.Marshal(user)
     if err != nil {
         fmt.Println(err)
     }
 //使用set命令
     conn.Do("set", constant.USER_FLAG+token, userJson)
  • Get命令
 conn := utils.GetRedisConnection()
     userjson, err := redis.String(conn.Do("get", constant.USER_FLAG+token))
     if err != nil {
         fmt.Println(err)
     }
 ​
     var user common.User
     json.Unmarshal([]byte(userjson), &user)
     //redis中不存在用户信息,从数据库中查找
     if user.Username == "" {
         user = dao.GetInfos(userId)
     }

注:redis.string()方法get命令返回的数据转成字符串,还有类似的redis.int()方法

基本思路

每个用户有都有一个关注 set 和粉丝 set,set 的存储的是用户的唯一 ID。

每当用户关注某人时,就会被写入到关注 set 中,同时对方的粉丝 set 也会记录当前用户

当需要判断两人是否进行互相关注时,可以直接使用 redis 中的 集合操作,找出对方关注 set 的交集。

原本我们使用 SQL 来实现这个功能的,性能上并不是很高效。

这样就可以免去使用 MySQL 查询实现了,更高效地提高性能。

操作Set相关命令

在上述操作Redis基础命令上,我们进阶一下使用最常用的set数据结构命令

  • 判断用户是否是成员
 //省略Redis连接
 //redis中set判断是否存在
         result, err := redis.Int(conn.Do("SISMEMBER", constant.VIDEO_FLAG+string(videoId), user.UserId))
         //不存在,点赞操作
         if err != nil {
             fmt.Println(err)
         }
 复制代码

result==1时:表示是存在该成员变量

result==0时:表示是不存在该成员变量

  • 获取所有成员
 conn.Do("SMEMBERS", constant.VIDEO_FLAG+string(videoId))
 复制代码

返回SET集合该key的所有成员

注意点

使用 redis 作为缓存需要额外注意“缓存失效”的情况。当 redis 查不到数据时,需要转而查询 MySQL 后端数据库,并且查到数据后,一定要将其更新到 redis 服务器中!

这里有一个提升效率的小细节:在往 redis 服务器更新数据的时候,可以作异步处理,另开一个协程进行更新。

这样当从 MySQL 查询出数据后,不必等待 redis 服务器的更新就可以及时将数据响应了!