• Go 之 redis 处理


    Redis是一个开源的内存数据库,支持诸如字符串(string)、哈希(hashe)、列表(list)、集合(set)、带范围查询的排序集合(sorted set)、bitmap、hyperloglog、带半径查询的地理空间索引(geospatial index)和流(stream)等数据结构。 

    1. package main
    2. import (
    3. "context"
    4. "errors"
    5. "fmt"
    6. "github.com/go-redis/redis/v8"
    7. "time"
    8. )
    9. var rdb *redis.Client
    10. func main() {
    11. rdb = redis.NewClient(&redis.Options{
    12. Addr: "localhost:6379",
    13. Password: "", // 密码
    14. DB: 0, // 数据库
    15. PoolSize: 20, // 连接池大小
    16. })
    17. doCommand()
    18. doDemo()
    19. val, err := getValueFromRedis("test", "value")
    20. fmt.Println(val, err)
    21. val, err = getValueFromRedis("key", "value")
    22. fmt.Println(val, err)
    23. scanKeysDemo()
    24. delKeysByMatch("key", 5*time.Second)
    25. pipelineDemo()
    26. }
    27. // doCommand go-redis基本使用示例
    28. func doCommand() {
    29. ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
    30. defer cancel()
    31. // 执行命令获取结果
    32. val, err := rdb.Get(ctx, "key").Result()
    33. if err != nil {
    34. fmt.Println(err)
    35. return
    36. }
    37. fmt.Println(val)
    38. // 先获取到命令对象
    39. cmder := rdb.Get(ctx, "key")
    40. fmt.Println(cmder.Val(), cmder.Err()) // 获取值和错误
    41. // 直接执行命令获取错误
    42. err = rdb.Set(ctx, "key", 10, time.Hour).Err()
    43. if err != nil {
    44. fmt.Println(err)
    45. return
    46. }
    47. // 直接执行命令获取值
    48. value := rdb.Get(ctx, "key").Val()
    49. fmt.Println(value)
    50. }
    51. // doDemo rdb.Do 方法使用示例
    52. func doDemo() {
    53. ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
    54. defer cancel()
    55. // 直接执行命令获取错误
    56. err := rdb.Do(ctx, "set", "key", 10, "EX", 3600).Err()
    57. fmt.Println(err)
    58. // 执行命令获取结果
    59. val, err := rdb.Do(ctx, "get", "key").Result()
    60. fmt.Println(val, err)
    61. }
    62. // getValueFromRedis redis.Nil判断
    63. func getValueFromRedis(key, defaultValue string) (string, error) {
    64. ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
    65. defer cancel()
    66. val, err := rdb.Get(ctx, key).Result()
    67. if err != nil {
    68. if errors.Is(err, redis.Nil) {
    69. return defaultValue, nil
    70. }
    71. return "", err
    72. }
    73. return val, nil
    74. }
    75. // scanKeysDemo 按前缀扫描key示例
    76. func scanKeysDemo() {
    77. ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
    78. defer cancel()
    79. // 按前缀扫描key
    80. iter := rdb.Scan(ctx, 0, "key*", 0).Iterator()
    81. for iter.Next(ctx) {
    82. fmt.Println("keys", iter.Val())
    83. }
    84. if err := iter.Err(); err != nil {
    85. panic(err)
    86. }
    87. }
    88. // delKeysByMatch 按match格式扫描所有key并删除
    89. func delKeysByMatch(match string, timeout time.Duration) {
    90. ctx, cancel := context.WithTimeout(context.Background(), timeout)
    91. defer cancel()
    92. iter := rdb.Scan(ctx, 0, match, 0).Iterator()
    93. for iter.Next(ctx) {
    94. fmt.Println("val", iter.Val())
    95. err := rdb.Del(ctx, iter.Val()).Err()
    96. if err != nil {
    97. panic(err)
    98. }
    99. }
    100. if err := iter.Err(); err != nil {
    101. panic(err)
    102. }
    103. }
    104. // pipelineDemo Redis Pipeline 允许通过使用单个 client-server-client 往返执行多个命令来提高性能
    105. func pipelineDemo() {
    106. ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
    107. defer cancel()
    108. pipe := rdb.Pipeline()
    109. incr := pipe.Incr(ctx, "pipeline_counter")
    110. pipe.Expire(ctx, "pipeline_counter", time.Hour)
    111. cmds, err := pipe.Exec(ctx)
    112. if err != nil {
    113. panic(err)
    114. }
    115. fmt.Println(cmds) // [incr pipeline_counter: 3 expire pipeline_counter 3600: true]
    116. // 在执行pipe.Exec之后才能获取到结果
    117. fmt.Println(incr.Val())
    118. }

  • 相关阅读:
    ABS新设海事软件公司ABS Wavesight™,引领船队运营驶入21世纪
    SpringBoot+MyBatisPlus+MySQL不能储存(保存)emoji表情问题解决
    [洛谷] P1327 数列排序 (普及-)
    微信小程序_8,视图与逻辑
    Houdini HDA参数无法删除
    1.2 消息队列(4-6)
    人工智能、深度学习、机器学习常见面试题71~82
    过去式-ed的发音规则
    Python 之 sqrt函数浅析
    爱奇艺:基于龙蜥与 Koordinator 在离线混部的实践解析
  • 原文地址:https://blog.csdn.net/TomorrowAndTuture/article/details/133357573