码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • groupcache源码(一)-groupcache使用


    1. groupcache是什么?

    groupcache是类似于memcache的分布式储存库,在使用时它既是客户端又是服务端

    2. groupcache使用代码示例

    1. package main
    2. import (
    3. "context"
    4. "errors"
    5. "github.com/golang/groupcache"
    6. "log"
    7. "net/http"
    8. "strconv"
    9. )
    10. const (
    11. // 启动的http端口
    12. ServicePort = 9000
    13. // groupcache内部通信端口 同时修改CachePort 和ServicePort 端口,模拟启动运行多个节点
    14. CachePort = 8000
    15. // 组名称
    16. GroupName = "user"
    17. )
    18. // 模拟数据库
    19. var UserDb = map[string]string{
    20. "1001": "张三",
    21. "1002": "李四",
    22. "1003": "王五",
    23. }
    24. // 数据不在缓存中时,加载数据
    25. // 使用单飞,防止缓存惊群效应
    26. func getterFunc(ctx context.Context, key string, dest groupcache.Sink) (err error) {
    27. log.Println("从数据库获取用户姓名,uid=" + key)
    28. name, ok := UserDb[key]
    29. if !ok {
    30. return errors.New("uid miss")
    31. }
    32. dest.SetString(name)
    33. return nil
    34. }
    35. func startHTTP() {
    36. group := groupcache.NewGroup(GroupName, 1<<20, groupcache.GetterFunc(getterFunc))
    37. http.HandleFunc("/getName", func(writer http.ResponseWriter, request *http.Request) {
    38. // 数据查询
    39. uid := request.URL.Query().Get("uid")
    40. log.Println("http uid=" + uid)
    41. var name []byte
    42. err := group.Get(context.Background(), uid, groupcache.AllocatingByteSliceSink(&name))
    43. if err != nil {
    44. writer.Write([]byte("404"))
    45. return
    46. }
    47. writer.Write([]byte("name=" + string(name)))
    48. })
    49. go http.ListenAndServe(":"+strconv.Itoa(ServicePort), nil)
    50. }
    51. func main() {
    52. startHTTP()
    53. // 启动groupcache
    54. localUrl := "http://127.0.0.1:" + strconv.Itoa(CachePort)
    55. peers := groupcache.NewHTTPPool(localUrl)
    56. peers.Set("http://127.0.0.1:8000", "http://127.0.0.1:8001")
    57. http.ListenAndServe(":"+strconv.Itoa(CachePort), peers)
    58. }

    3. 代码介绍

    1. HTTPPool

        集群中所有节点通过http通讯,存储所有节点

    2. Group

       负责数据的处理

    3. GetterFunc

       数据不存在时,加载数据

    4. 集群简介

    groupcache集群使用一致性哈希算法,服务的节点收到请求后,发现数据不在本节点,会去对应节点获取数据,然后将数据返回

  • 相关阅读:
    【AcWing16】【LeetCode】并查集Union Find-128/130/*1020-学完广度优先/深度优先要回来再看
    招投标系统简介 企业电子招投标采购系统源码之电子招投标系统 —降低企业采购成本
    浅析React Hook之useReducer
    Python数据分析--Numpy常用函数介绍(6)--Numpy中与股票成交量有关的计算
    linux免密
    Ubuntu卸载python,重启电脑后进入tty1界面,无法进入图像化界面
    绕过命令过滤器:探索UnixLinux中的Bypass技术
    图片处理后再保存为图片到文件夹中,文件夹下文件名不变改格式保存
    对于Oracle,MySQL,SQL Server重复数据删除
    Redis——字典
  • 原文地址:https://blog.csdn.net/qq_22323251/article/details/127041689
  • 最新文章
  • 【FHE】我们如何实现同态加密推理(八):SiLU 的密文化——两条路径,和一个 8 字节的开关
    SQLcl 中 c/old/new 替换变量为何失效?先定位再替换
    不让模型写作文,直接从它脑子里读答案:Jev 决策在 .NET 的两条路线
    Halo插件:支持GitHub的图床附件策略
    电视投屏界的“一股清流”!SimpleTVCast 6.0.0-beta 抢先体验:无需TV端App,界面大换血!✨
    华三VXLAN集中式网关实战指南:Spine多活网关 + 双活接入(M-LAG)
    软件更好写之后口碑会更重要
    大 O、大 Omega、大 Theta 的区别,O(n) 复杂度是什么意思
    Java标签跳转:一个鲜为人知但却很实用的小技巧
    多智能体系统论文速读
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号