Go语言学习笔记(十六)------数据库Redis学习笔记

Go游戏服务器开发的一些思考(二十六):Go Redis ORM库 ORM对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping)。通常指,数据库到程序内类对象的映射。程序中使用ORM的好处 使用ORM,字段更改,编译器能做编译错误检查 直接使用数据库命令字符串,做修改,需要人工排查 使用ORM,隐藏背后数据库操作策略 能比较容易做到,直接调用Load()、Save()这样的简单函数,使用 阅读详情

一、redis介绍

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。目前应用redis最广泛的应该是新浪微博平台,其次还有Facebook收购的图片社交网站instagram。以及其他一些有名的互联网企业。

Go目前支持redis的驱动有如下

我以redigo驱动为例来演示如何进行数据的操作。

二、redis安装

1.打开链接下载windows版:https://github.com/MSOpenTech/redis/releases,并解压文件,文件介绍:

redis-benchmark.exe #基准测试

redis-check-aof.exe # aof

redischeck-dump.exe # dump

redis-cli.exe # 客户端

redis-server.exe # 服务器

redis.windows.conf # 配置文件

2.打开一个cmd窗口 使用 cd 命令切换目录到 F:\备份软件\Redis-x64-3.2.100运行:redis-server.exe redis.windows.conf,最后把路径F:\备份软件\Redis-x64-3.2.100;添加到path环境变量中。另启一个cmd窗口,原来的不要关闭,不然就无法访问服务端了。切换到 redis 目录下运行:redis-cli.exe -h 127.0.0.1 -p 6379。

3.测试数据:设置键值对:set myKey abc,取出键值对:get myKey。

4.Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf。你可以通过 CONFIG 命令查看或设置配置项。Redis CONFIG 命令格式如下:CONFIG GET CONFIG_SETTING_NAME,示例:redis 127.0.0.1:6379> CONFIG GET loglevel ,使用 * 号获取所有配置项。通过修改 redis.conf 文件或使用 CONFIG set 命令来修改配置。基本语法:redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE,示例:redis 127.0.0.1:6379> CONFIG SET loglevel "notice"

三、redis数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

1.string字符串:string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。示例:

redis 127.0.0.1:6379> SET name "runoob"
OK
redis 127.0.0.1:6379> GET name
"runoob"

在以上实例中我们使用了 Redis 的 SET 和 GET 命令。键为 name,对应的值为 runoob。

2.Hash(哈希),Redis hash 是一个键值(key=>value)对集合。Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。示例:

redis> HMSET myhash field1 "Hello" field2 "World"
"OK"
redis> HGET myhash field1
"Hello"
redis> HGET myhash field2
"World"

实例中我们使用了 Redis HMSET, HGET 命令,HMSET 设置了两个 field=>value 对, HGET 获取对应 field 对应的 value。每个 hash 可以存储 232 -1 键值对(40多亿)。

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

redis 127.0.0.1:6379> lpush runoob1 redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob1 mongodb
(integer) 2
redis 127.0.0.1:6379> lpush runoob1 rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob1 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"

列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。

4.Set(集合),Redis的Set是string类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。sadd 命令:sadd key member ,添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0,如果 key 对应的 set 不存在则返回错误。示例:

redis 127.0.0.1:6379> sadd runoob2 redis
(integer) 1
redis 127.0.0.1:6379> sadd runoob2 mongodb
(integer) 1
redis 127.0.0.1:6379> sadd runoob2 rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd runoob2 rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers runoob2

1) "redis"
2) "rabitmq"
3) "mongodb"

注意:以上实例中 rabitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。

5.zset(sorted set:有序集合),Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。zadd 命令:zadd key score member,添加元素到集合,元素在集合中存在则更新对应score。 示例:

redis 127.0.0.1:6379> zadd runoob3 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob3 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob3 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob3 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob3 0 1000
1) "mongodb"
2) "rabitmq"
3) "redis"

6.各个数据类型应用场景:

类型简介特性场景
String(字符串)二进制安全可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M---
Hash(字典)键值对集合,即编程语言中的Map类型适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去)存储、读取、修改用户属性
List(列表)链表(双向链表)增删快,提供了操作某一段元素的API1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列
Set(集合)哈希表实现,元素不重复1、添加、删除,查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐
Sorted Set(有序集合)将Set中的元素增加一个权重参数score,元素按score有序排列数据插入集合时,已经进行天然排序1、排行榜 2、带权重的消息队列

注:Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念。比如可以使用0号数据库存储某个应用生产环境中的数据,使用1号数据库存储测试环境中的数据,但不适宜使用0号数据库存储A应用的数据而使用1号数据库B应用的数据,不同的应用应该使用不同的Redis实例存储数据。示例:

redis> SELECT 1
OK
redis [1] > GET foo
(nil)

四、redis常用命令

1.在 redis 服务上执行命令需要一个 redis 客户端。Redis 客户端在我们之前下载的的 redis 的安装包中。Redis 客户端的基本语法为:$ redis-cl,启动 redis 客户端,打开终端并输入命令 redis-cli。该命令会连接本地的 redis 服务。在以上实例中我们连接到本地的 redis 服务并执行 PING 命令,该命令用于检测 redis 服务是否启动:

$redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING
PONG

在远程 redis 服务上执行命令,同样我们使用的也是 redis-cli 命令。语法:$ redis-cli -h host -p port -a password,以下实例演示了如何连接到主机为 127.0.0.1,端口为 6379 ,密码为 mypass 的 redis 服务上:

$redis-cli -h 127.0.0.1 -p 6379 -a "mypass"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING
PONG

注:有时候会有中文乱码。要在 redis-cli 后面加上 --raw,redis-cli --raw就可以避免中文乱码了。

2.Redis 键命令用于管理 redis 的键。Redis 键命令的基本语法如下:redis 127.0.0.1:6379> COMMAND KEY_NAME,示例:

redis 127.0.0.1:6379> SET runoobkey redis
OK
redis 127.0.0.1:6379> DEL runoobkey
(integer) 1

在以上实例中 DEL 是一个命令, runoobkey 是一个键。 如果键被删除成功,命令执行后输出 (integer) 1,否则将输出 (integer) 0,下表给出了与 Redis 键相关的基本命令:

序号命令及描述
1DEL key
该命令用于在 key 存在时删除 key。
2DUMP key 
序列化给定 key ,并返回被序列化的值。
3EXISTS key 
检查给定 key 是否存在。
4EXPIRE key seconds
为给定 key 设置过期时间,以秒计。
5EXPIREAT key timestamp 
EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。
6PEXPIRE key milliseconds 
设置 key 的过期时间以毫秒计。
7PEXPIREAT key milliseconds-timestamp 
设置 key 过期时间的时间戳(unix timestamp) 以毫秒计
8KEYS pattern 
查找所有符合给定模式( pattern)的 key 。
9MOVE key db 
将当前数据库的 key 移动到给定的数据库 db 当中。
10PERSIST key 
移除 key 的过期时间,key 将持久保持。
11PTTL key 
以毫秒为单位返回 key 的剩余的过期时间。
12TTL key 
以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
13RANDOMKEY 
从当前数据库中随机返回一个 key 。
14RENAME key newkey 
修改 key 的名称
15RENAMENX key newkey 
仅当 newkey 不存在时,将 key 改名为 newkey 。
16TYPE key 
返回 key 所储存的值的类型。

更多命令请参考:https://redis.io/commands

3.Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下:redis 127.0.0.1:6379> COMMAND KEY_NAME,示例:

127.0.0.1:6379> set test1 1
OK
127.0.0.1:6379> decr test1
(integer) 0
127.0.0.1:6379> get test1
"0"

下表列出了常用的 redis 字符串命令:

序号命令及描述
1SET key value 
设置指定 key 的值
2GET key 
获取指定 key 的值。
3GETRANGE key start end 
返回 key 中字符串值的子字符
4GETSET key value
将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
5GETBIT key offset
对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
6MGET key1 [key2..]
获取所有(一个或多个)给定 key 的值。
7SETBIT key offset value
对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
8SETEX key seconds value
将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
9SETNX key value
只有在 key 不存在时设置 key 的值。
10SETRANGE key offset value
用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。
11STRLEN key
返回 key 所储存的字符串值的长度。
12MSET key value [key value ...]
同时设置一个或多个 key-value 对。
13MSETNX key value [key value ...] 
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
14PSETEX key milliseconds value
这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
15INCR key
将 key 中储存的数字值增一。
16INCRBY key increment
将 key 所储存的值加上给定的增量值(increment) 。
17INCRBYFLOAT key increment
将 key 所储存的值加上给定的浮点增量值(increment) 。
18DECR key
将 key 中储存的数字值减一。
19DECRBY key decrement
key 所储存的值减去给定的减量值(decrement) 。
20APPEND key value
如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。

4.Redis hash 是一个string类型的field和value的映射表,hash适合用于存储对象。Redis 中每个 hash 可以存储 232 - 1 键值对(40亿)。我们设置了 redis 的一些描述信息(name, description, likes, visitors) 到哈希表的 runoobkey 中。示例:

127.0.0.1:6379>  HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
OK
127.0.0.1:6379>  HGETALL runoobkey
1) "name"
2) "redis tutorial"
3) "description"
4) "redis basic commands for caching"
5) "likes"
6) "20"
7) "visitors"
8) "23000"

 redis hash 基本的相关命令:

序号命令及描述
1HDEL key field1 [field2] 
删除一个或多个哈希表字段
2HEXISTS key field 
查看哈希表 key 中,指定的字段是否存在。
3HGET key field 
获取存储在哈希表中指定字段的值。
4HGETALL key 
获取在哈希表中指定 key 的所有字段和值
5HINCRBY key field increment 
为哈希表 key 中的指定字段的整数值加上增量 increment 。
6HINCRBYFLOAT key field increment 
为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
7HKEYS key 
获取所有哈希表中的字段
8HLEN key 
获取哈希表中字段的数量
9HMGET key field1 [field2] 
获取所有给定字段的值
10HMSET key field1 value1 [field2 value2 ] 
同时将多个 field-value (域-值)对设置到哈希表 key 中。
11HSET key field value 
将哈希表 key 中的字段 field 的值设为 value 。
12HSETNX key field value 
只有在字段 field 不存在时,设置哈希表字段的值。
13HVALS key 
获取哈希表中所有值
14HSCAN key cursor [MATCH pattern] [COUNT count] 
迭代哈希表中的键值对。

5.Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。例如我们使用了 LPUSH 将三个值插入了名为 runoobkey 的列表当中。下表列出了列表相关的基本命令:

序号命令及描述
1BLPOP key1 [key2 ] timeout 
移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
2BRPOP key1 [key2 ] timeout 
移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
3BRPOPLPUSH source destination timeout 
从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
4LINDEX key index 
通过索引获取列表中的元素
5LINSERT key BEFORE|AFTER pivot value 
在列表的元素前或者后插入元素
6LLEN key 
获取列表长度
7LPOP key 
移出并获取列表的第一个元素
8LPUSH key value1 [value2] 
将一个或多个值插入到列表头部
9LPUSHX key value 
将一个值插入到已存在的列表头部
10LRANGE key start stop 
获取列表指定范围内的元素
11LREM key count value 
移除列表元素
12LSET key index value 
通过索引设置列表元素的值
13LTRIM key start stop 
对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
14RPOP key 
移除列表的最后一个元素,返回值为移除的元素。
15RPOPLPUSH source destination 
移除列表的最后一个元素,并将该元素添加到另一个列表并返回
16RPUSH key value1 [value2] 
在列表中添加一个或多个值
17RPUSHX key value 
为已存在的列表添加值

6.Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。例如通过 SADD 命令向名为 runoobkey 的集合插入的三个元素。下表列出了 Redis 集合基本命令:

序号命令及描述
1SADD key member1 [member2] 
向集合添加一个或多个成员
2SCARD key 
获取集合的成员数
3SDIFF key1 [key2] 
返回给定所有集合的差集
4SDIFFSTORE destination key1 [key2] 
返回给定所有集合的差集并存储在 destination 中
5SINTER key1 [key2] 
返回给定所有集合的交集
6SINTERSTORE destination key1 [key2] 
返回给定所有集合的交集并存储在 destination 中
7SISMEMBER key member 
判断 member 元素是否是集合 key 的成员
8SMEMBERS key 
返回集合中的所有成员
9SMOVE source destination member 
将 member 元素从 source 集合移动到 destination 集合
10SPOP key 
移除并返回集合中的一个随机元素
11SRANDMEMBER key [count] 
返回集合中一个或多个随机数
12SREM key member1 [member2] 
移除集合中一个或多个成员
13SUNION key1 [key2] 
返回所有给定集合的并集
14SUNIONSTORE destination key1 [key2] 
所有给定集合的并集存储在 destination 集合中
15SSCAN key cursor [MATCH pattern] [COUNT count] 
迭代集合中的元素

7.Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

redis 127.0.0.1:6379> ZADD runoobkey 1 redis
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 2 mongodb
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 0
redis 127.0.0.1:6379> ZADD runoobkey 4 mysql
(integer) 0
redis 127.0.0.1:6379> ZRANGE runoobkey 0 10 WITHSCORES

1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "4"

在以上实例中我们通过命令 ZADD 向 redis 的有序集合中添加了三个值并关联上分数。下表列出了 redis 有序集合的基本命令:

序号命令及描述
1ZADD key score1 member1 [score2 member2] 
向有序集合添加一个或多个成员,或者更新已存在成员的分数
2ZCARD key 
获取有序集合的成员数
3ZCOUNT key min max 
计算在有序集合中指定区间分数的成员数
4ZINCRBY key increment member 
有序集合中对指定成员的分数加上增量 increment
5ZINTERSTORE destination numkeys key [key ...] 
计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
6ZLEXCOUNT key min max 
在有序集合中计算指定字典区间内成员数量
7ZRANGE key start stop [WITHSCORES] 
通过索引区间返回有序集合成指定区间内的成员
8ZRANGEBYLEX key min max [LIMIT offset count] 
通过字典区间返回有序集合的成员
9ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 
通过分数返回有序集合指定区间内的成员
10ZRANK key member 
返回有序集合中指定成员的索引
11ZREM key member [member ...] 
移除有序集合中的一个或多个成员
12ZREMRANGEBYLEX key min max 
移除有序集合中给定的字典区间的所有成员
13ZREMRANGEBYRANK key start stop 
移除有序集合中给定的排名区间的所有成员
14ZREMRANGEBYSCORE key min max 
移除有序集合中给定的分数区间的所有成员
15ZREVRANGE key start stop [WITHSCORES] 
返回有序集中指定区间内的成员,通过索引,分数从高到底
16ZREVRANGEBYSCORE key max min [WITHSCORES] 
返回有序集中指定分数区间内的成员,分数从高到低排序
17ZREVRANK key member 
返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
18ZSCORE key member 
返回有序集中,成员的分数值
19ZUNIONSTORE destination numkeys key [key ...] 
计算给定的一个或多个有序集的并集,并存储在新的 key 中
20ZSCAN key cursor [MATCH pattern] [COUNT count] 
迭代有序集合中的元素(包括元素成员和元素分值)

8.Redis HyperLogLog:Redis 在 2.8.9 版本添加了 HyperLogLog 结构。Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。什么是基数?比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。以下实例演示了 HyperLogLog 的工作过程:

redis 127.0.0.1:6379> PFADD runoobkey "redis"

1) (integer) 1

redis 127.0.0.1:6379> PFADD runoobkey "mongodb"

1) (integer) 1

redis 127.0.0.1:6379> PFADD runoobkey "mysql"

1) (integer) 1

redis 127.0.0.1:6379> PFCOUNT runoobkey

(integer) 3

 

下表列出了 redis HyperLogLog 的基本命令:

序号命令及描述
1PFADD key element [element ...] 
添加指定元素到 HyperLogLog 中。
2PFCOUNT key [key ...] 
返回给定 HyperLogLog 的基数估算值。
3PFMERGE destkey sourcekey [sourcekey ...] 
将多个 HyperLogLog 合并为一个 HyperLogLog

五、redis特殊功能

1.Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道。下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:

pubsub1

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

pubsub2

实例演示了发布订阅是如何工作的。在我们实例中我们创建了订阅频道名为 redisChat:

redis 127.0.0.1:6379> SUBSCRIBE redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1

现在,我们先重新开启个 redis 客户端,然后在同一个频道 redisChat 发布两次消息,订阅者就能接收到消息。

redis 127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique"

(integer) 1

redis 127.0.0.1:6379> PUBLISH redisChat "Learn redis by runoob.com"

(integer) 1
# 订阅者的客户端会显示如下消息
1) "message"
2) "redisChat"
3) "Redis is a great caching technique"
1) "message"
2) "redisChat"
3) "Learn redis by runoob.com"

下表列出了 redis 发布订阅常用命令:

序号命令及描述
1PSUBSCRIBE pattern [pattern ...] 
订阅一个或多个符合给定模式的频道。
2PUBSUB subcommand [argument [argument ...]] 
查看订阅与发布系统状态。
3PUBLISH channel message 
将信息发送到指定的频道。
4PUNSUBSCRIBE [pattern [pattern ...]] 
退订所有给定模式的频道。
5SUBSCRIBE channel [channel ...] 
订阅给定的一个或多个频道的信息。
6UNSUBSCRIBE [channel [channel ...]] 
指退订给定的频道。

2.Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:

  • 批量操作在发送 EXEC 命令前被放入队列缓存。
  • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历以下三个阶段:

  • 开始事务。
  • 命令入队。
  • 执行事务。

以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:

redis 127.0.0.1:6379> MULTI
OK

redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED

redis 127.0.0.1:6379> GET book-name
QUEUED

redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED

redis 127.0.0.1:6379> SMEMBERS tag
QUEUED

redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
   2) "C++"
   3) "Programming"

单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。比如:

redis 127.0.0.1:7000> multi
OK
redis 127.0.0.1:7000> set a aaa
QUEUED
redis 127.0.0.1:7000> set b bbb
QUEUED
redis 127.0.0.1:7000> set c ccc
QUEUED
redis 127.0.0.1:7000> exec
1) OK
2) OK
3) OK

如果在 set b bbb 处失败,set a 已成功不会回滚,set c 还会继续执行。下表列出了 redis 事务的相关命令:

序号命令及描述
1DISCARD 
取消事务,放弃执行事务块内的所有命令。
2EXEC 
执行所有事务块内的命令。
3MULTI 
标记一个事务块的开始。
4UNWATCH 
取消 WATCH 命令对所有 key 的监视。
5WATCH key [key ...] 
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

3.Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL。Eval 命令的基本语法如下:redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...],以下实例演示了 redis 脚本工作过程:

redis 127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second

1) "key1"
2) "key2"
3) "first"
4) "second"

下表列出了 redis 脚本常用命令:

序号命令及描述
1EVAL script numkeys key [key ...] arg [arg ...] 
执行 Lua 脚本。
2EVALSHA sha1 numkeys key [key ...] arg [arg ...] 
执行 Lua 脚本。
3SCRIPT EXISTS script [script ...] 
查看指定的脚本是否已经被保存在缓存当中。
4SCRIPT FLUSH 
从脚本缓存中移除所有脚本。
5SCRIPT KILL 
杀死当前正在运行的 Lua 脚本。
6SCRIPT LOAD script 
将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本。

4.Redis 连接命令主要是用于连接 redis 服务。以下实例演示了客户端如何通过密码验证连接到 redis 服务,并检测服务是否在运行:

redis 127.0.0.1:6379> AUTH "password"
OK
redis 127.0.0.1:6379> PING
PONG

下表列出了 redis 连接的基本命令:

 

序号命令及描述
1AUTH password 
验证密码是否正确
2ECHO message 
打印字符串
3PING 
查看服务是否运行
4QUIT 
关闭当前连接
5SELECT index 
切换到指定的数据库

5.edis 服务器命令主要是用于管理 redis 服务。以下实例演示了如何获取 redis 服务器的统计信息:redis 127.0.0.1:6379> INFO,具体命令可看链接:http://www.runoob.com/redis/redis-server.html。

6.Redis 数据备份与恢复Redis SAVE 命令用于创建当前数据库的备份。redis Save 命令基本语法如下:redis 127.0.0.1:6379> SAVE 。 该命令将在 redis 安装目录中创建dump.rdb文件。恢复数据,如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。获取 redis 目录可以使用 CONFIG 命令,如下所示:

redis 127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/usr/local/redis/bin"

以上命令 CONFIG GET dir 输出的 redis 安装目录为 /usr/local/redis/bin。Bgsave,创建 redis 备份文件也可以使用命令 BGSAVE,该命令在后台执行。

7.我们可以通过 redis 的配置文件设置密码参数,这样客户端连接到 redis 服务就需要密码验证,这样可以让你的 redis 服务更安全。我们可以通过以下命令查看是否设置了密码验证:

127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) ""

默认情况下 requirepass 参数是空的,这就意味着你无需通过密码验证就可以连接到 redis 服务。你可以通过以下命令来修改该参数:

127.0.0.1:6379> CONFIG set requirepass "runoob"
OK
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) "runoob"

设置密码后,客户端连接 redis 服务就需要密码验证,否则无法执行命令。AUTH 命令基本语法格式如下:27.0.0.1:6379> AUTH password,实例:

127.0.0.1:6379> AUTH "runoob"
OK
127.0.0.1:6379> SET mykey "Test value"
OK
127.0.0.1:6379> GET mykey
"Test value"

六、使用Go来操作redis数据库

1.连接:Conn接口是与Redis协作的主要接口,可以使用Dial,DialWithTimeout或者NewConn函数来创建连接,当任务完成时,应用程序必须调用Close函数来完成操作。

2.命令操作:通过使用Conn接口中的do方法执行redis命令,redis命令大全参考:http://doc.redisfans.com/,go中发送与响应对应类型:Do函数会必要时将参数转化为二进制字符串:

Go TypeConversion
[]byteSent as is
string  Sent as is
int, int64strconv.FormatInt(v)
float64strconv.FormatFloat(v, 'g', -1, 64)
bool true -> "1", false -> "0"
nil  ""
all other types  fmt.Print(v)

Redis 命令响应会用以下Go类型表示:

Redis typeGo type
error  redis.Error
integer int64
simple string string
bulk string[]byte or nil if value not present.
array    []interface{} or nil if value not present

可以使用GO的类型断言或者reply辅助函数将返回的interface{}转换为对应类型。

3.字符串set与get命令操作:连接数据库服务器生成conn接口:conn,err := redis.Dial("tcp","127.0.0.1:6379"),设置string字符串属性:_, err = conn.Do("SET", "name", "xiaoming"),获得name代表的字符串:name, err := redis.String(conn.Do("GET", "name")),关掉接口,断开连接:defer conn.Close()。

4.字符串批量获取mget、批量设置mset:批量设置string:_, err = conn.Do("MSET", "pname", "xiaoming","age",30),批量获得string:res, err := redis.Strings(conn.Do("MGET", "pname","age")),通过反射读取变量类型:res_type := reflect.TypeOf(res)。

5.哈希表批量设置域-值hmset、获取域值hget操作:批量设置域值属性:_, err = conn.Do("HMSET", "user","name", "小明","age",30),获取域值属性:res, err := redis.Int64(conn.Do("HGET", "user","age"))。单个设置域值属性:_, err = conn.Do("HMSET", "user","name", "小明")。

6.列表操作LPUSH:将列表list1写入数据库:_, err = conn.Do("LPUSH", "list1", "ele1", "ele2", "ele3", "ele4"),由索引值0-3获取列表元素:res, err := redis.Strings(conn.Do("LRANGE", "list1", 0, 3)),获取栈顶元素:res, err := redis.String(conn.Do("LPOP", "list1")),获取指定位置的元素:res, err := redis.String(conn.Do("LINDEX", "list1", 3))。

7.管道操作可以理解为并发操作,并通过Send(),Flush(),Receive()三个方法实现。客户端可以使用send()方法一次性向服务器发送一个或多个命令,命令发送完毕时,使用flush()方法将缓冲区的命令输入一次性发送到服务器,客户端再使用Receive()方法依次按照先进先出的顺序读取所有命令操作结果。

Send(commandName string, args ...interface{}) error
Flush() error
Receive() (reply interface{}, err error)

 

  • Send:发送命令至缓冲区
  • Flush:清空缓冲区,将命令一次性发送至服务器
  • Recevie:依次读取服务器响应结果,当读取的命令未响应时,该操作会阻塞。

示例:

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

func main() {
	conn, err := redis.Dial("tcp", "127.0.0.1:6379")
	if err != nil {
		fmt.Println("connect redis error :", err)
		return
	}
	fmt.Println("connect success ...")
	conn.Send("HMSET", "user","name", "xiaohon","age","30")
	conn.Send("HSET", "user","sex","male")
	conn.Send("HGET", "user","age")
	conn.Flush()

	res1, err := conn.Receive()
	fmt.Printf("Receive res1:%v \n", res1)
	res2, err := conn.Receive()
	fmt.Printf("Receive res2:%v\n",res2)
	res3, err := conn.Receive()
	fmt.Printf("Receive res3:%s\n",res3)
}

8.edis本身具有发布订阅的功能,其发布订阅功能通过命令SUBSCRIBE(订阅)/PUBLISH(发布)实现,并且发布订阅模式可以是多对多模式还可支持正则表达式,发布者可以向一个或多个频道发送消息,订阅者可订阅一个或者多个频道接受消息。操作示例,示例中将使用两个goroutine分别担任发布者和订阅者角色进行演示:

package main

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

func Subs() {  //订阅者
	conn, err := redis.Dial("tcp", "127.0.0.1:6379")
	if err != nil {
		fmt.Println("connect redis error :", err)
		return
	}
	defer conn.Close()
	psc := redis.PubSubConn{conn}
	psc.Subscribe("测试通道") //订阅频道
	for {
		switch v := psc.Receive().(type) {
		case redis.Message:
			fmt.Printf("%s: 信息是: %s\n", v.Channel, v.Data)
		case redis.Subscription:
			fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count)
		case error:
			fmt.Println(v)
			return
		}
	}
}

func Push(message string)  { //发布者
	conn, _ := redis.Dial("tcp", "127.0.0.1:6379")
	_,err1 := conn.Do("PUBLISH", "测试通道", message)
	if err1 != nil {
		fmt.Println("pub err: ", err1)
		return
	}

}

func main()  {
	go Subs()
	go Push("这是通道发送的测试信息")
	time.Sleep(time.Second*3)
}

输出:

测试通道: subscribe 1
测试通道: 信息是: 这是通道发送的测试信息

9.事务操作,MULTI, EXEC,DISCARD和WATCH是构成Redis事务的基础,当然我们使用go语言对redis进行事务操作的时候本质也是使用这些命令。MULTI:开启事务、EXEC:执行事务、DISCARD:取消事务、WATCH:监视事务中的键变化,一旦有改变则取消事务。

package main

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

func main()  {
	conn, err := redis.Dial("tcp", "127.0.0.1:6379")
	if err != nil {
		fmt.Println("connect redis error :", err)
		return
	}
	fmt.Println("connect success ...")
	defer conn.Close()

	conn.Send("MULTI")
	conn.Send("INCR", "foo")
	conn.Send("INCR", "bar")
	r, err := conn.Do("EXEC")
	fmt.Println(r)
}

10.连接池使用:redis连接池是通过pool结构体实现,以下是源码定义,相关参数说明已经备注:

type Pool struct {
    // Dial is an application supplied function for creating and configuring a
    // connection.
    //
    // The connection returned from Dial must not be in a special state
    // (subscribed to pubsub channel, transaction started, ...).
    Dial func() (Conn, error) //连接方法

    // TestOnBorrow is an optional application supplied function for checking
    // the health of an idle connection before the connection is used again by
    // the application. Argument t is the time that the connection was returned
    // to the pool. If the function returns an error, then the connection is
    // closed.
    TestOnBorrow func(c Conn, t time.Time) error

    // Maximum number of idle connections in the pool.
    MaxIdle int  //最大的空闲连接数,即使没有redis连接时依然可以保持N个空闲的连接,而不被清除,随时处于待命状态

    // Maximum number of connections allocated by the pool at a given time.
    // When zero, there is no limit on the number of connections in the pool.
    MaxActive int //最大的激活连接数,同时最多有N个连接

    // Close connections after remaining idle for this duration. If the value
    // is zero, then idle connections are not closed. Applications should set
    // the timeout to a value less than the server's timeout.
    IdleTimeout time.Duration  //空闲连接等待时间,超过此时间后,空闲连接将被关闭

    // If Wait is true and the pool is at the MaxActive limit, then Get() waits
    // for a connection to be returned to the pool before returning.
    Wait bool  //当配置项为true并且MaxActive参数有限制时候,使用Get方法等待一个连接返回给连接池

    // Close connections older than this duration. If the value is zero, then
    // the pool does not close connections based on age.
    MaxConnLifetime time.Duration
    // contains filtered or unexported fields
}

示例代码:

package main

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

var Pool redis.Pool
func init()  {      //init 用于初始化一些参数,先于main执行
	Pool = redis.Pool{
		MaxIdle:     16,
		MaxActive:   32,
		IdleTimeout: 120,
		Dial: func() (redis.Conn, error) {
			return redis.Dial("tcp", "127.0.0.1:6379")
		},
	}
}

func main()  {

	conn :=Pool.Get()
	res,err := conn.Do("HSET","user","name","小红")
	fmt.Println(res,err)
	res1,err := redis.String(conn.Do("HGET","user","name"))
	fmt.Printf("res:%s,error:%v",res1,err)

}
//0 <nil>
//res:小红,error:<nil>

 

RK3588 MIPI屏幕调试避坑指南:双通道8Lane下DSC压缩屏的花屏、分层问题排查实录 本文详细解析了RK3588平台在双通道8Lane MIPI接口下调试DSC压缩屏时遇到的花屏、分层问题。通过硬件信号完整性检查、软件配置验证及帧数据分析,提供了一套系统化的排查方法,并深入探讨了初始化序列优化和双通道同步机制,帮助工程师高效解决高分辨率屏幕显示异常问题。 阅读详情

相关推荐

『n8n』初识界面

在首页(Overview),我们和 n8n 最常打交道的是“Workflows”、“Credentials”、“Executions”这几个面板(其实后面2个也会用到,但初学阶段可以先不管)。Workflows 面板可以看到我们创建的所有工作流,所以要给工作流起一个一眼看上去就知道是干嘛的名字。

weixin_39415598的博客 1459

go-zero微服务实战系列(五、缓存代码怎么写)

缓存是高并发服务的基础,毫不夸张的说没有缓存高并发服务就无从谈起。本项目缓存使用Redis,Redis是目前主流的缓存数据库,支持丰富的数据类型,其中集合类型的底层主要依赖:整数数组、双向链表、哈希表、压缩列表和跳表五种数据结构。由于底层依赖的数据结构的高效性以及基于多路复用的高性能I/O模型,所以Redis也提供了非常强悍的性能。下图展示了Redis数据类型对应的底层数据结构。

hjxisking的专栏 598

PyQtWebEngine安装避坑指南:快速解决ModuleNotFoundError

本文详细解析了PyQt5开发中常见的ModuleNotFoundError: No module named 'PyQt5.QtWebEngineWidgets'错误。核心原因是PyQt5 5.11版本后,网页引擎组件被独立为PyQtWebEngine包。文章对比了退回旧版本、独立安装及使用Conda等多种解决方案,并提供了针对Windows、macOS和Linux不同平台的实战安装指南与验证方法,帮助开发者快速解决依赖问题。

weixin_29056101的博客 427

Redis有序集合命令ZREVRANGEBYSCORE详解与应用

Redis有序集合命令ZREVRANGEBYSCORE详解与应用 本文是我在redis中文网翻译团队翻译redis命令的相关内容,也是取得翻译团队同意后在优快云同步发表 redis.cn翻译团队 也欢迎有兴趣和能力的朋友加入! 根据分数排序获取成员列表 ZREVRANGEBYSCORE1 简介ZREVRANGEBYSCORE 返回有序集合中指定分数区间内的成员,分数由高到低排序。

大大的微笑的专栏 3万+

光通信仿真入门:手把手教你用VPI和Matlab搭建第一个联合仿真系统(含避坑指南)

本文详细介绍了如何使用VPI和Matlab搭建光通信联合仿真系统,涵盖软件配置、链路搭建、数据交互等关键环节,并提供常见问题的解决方案。特别适合初学者快速掌握光通信仿真技术,避免常见错误,提升仿真效率。

weixin_28733637的博客 377

使用 ABAP 代码动态创建新的 Function Module

通过内表。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 6906

Go:基于 Redis 实现的延迟队列详解

点击上方蓝色“Go语言中文网”关注,每天一起学 Go大家好,本文来自 Go 爱好者投稿,作者:finley背景 我们在工作中经常遇到等待一段时间后再执行某些任务的需求,比如:若订单创建 15 分钟后仍未支付,需要关闭订单并释放库存。用户设置了一个 “下午 2 点提醒我去做核酸” 的待办事项。当回调失败后等待 30 秒然后重试, 第二次失败后等待 1 分钟再次重试, 第三次失败后等待 10 分钟……...

Seekload 2020

【C语言学习疑难杂症】第20期:0x00007FF7F2821964处引发的异常0xC0000005写入位置 0x0000000000000

检查代码中是否存在野指针访问的情况,确保在进行写入操作之前,内存已经被正确分配或初始化,并且在使用完毕后进行了正确的释放。空指针访问:代码尝试在空指针地址(0x0000000000000000)处进行写入操作,导致访问冲突。检查代码中是否存在数组越界的情况,确保在进行写入操作之前,数组的索引值在合法范围内。检查代码中是否存在空指针访问的情况,确保在进行写入操作之前,指针已经被正确初始化。野指针访问:代码尝试在已释放或未初始化的内存地址进行写入操作,导致访问冲突。

学无止境 828

Redis命令快速检索

总结了Redis的命令,希望能快速检索到想要的命令。 键(Keys) DEL key [key ...] 删除一个或多个key。返回:删除的个数DUMP key 返回指定的key序列化后的值,用RESTORE可以反序列化key,可用于数据的转存EXISTS key 查询一个key是否存在。返回:1-存在;0-不存在EXPIRE key seconds 设置一个key的过期的秒数。返

janekeyzheng的专栏 1142

DSP篇--C6678功能调试系列之SPI调试

SPI传输数据分为线上直接收发和通过EDMA的数据传输两种。第一种是直接将数据放在线上(SPIDAT1),在寄存器(SPIBUF)中写入命令实现数据的收发;第二种需要配置EDMA,将数据buffer直接作为EDMA的数据源进行传输,其需要配置的参数和中断与EDMA一致。

nanke_yh的博客 1258

C# 与华中数控设备通信:数控机床自动化控制与实时监测系统

华中数控系统与C#通信开发指南 核心要点 通信基础 支持串口(RS232/RS485)和以太网两种连接方式 协议选择:通用Modbus协议或华中自定义HNC协议 关键数据映射表明确各参数对应的寄存器地址和功能码 系统架构 四层架构:设备层→通信层→业务层→应用层 包含实时数据采集、指令下发、状态监控、异常处理全流程 支持Modbus和HNC协议动态切换 代码实现 串口通信使用NModbus库简化开发 提供连接管理、数据读取、指令下发完整示例 包含异常处理和超时重连机制 应用价值 实现数控机床远程监控和自动化

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 2018

Go语言学习笔记(一)------目录

做区块链项目,发现自己的Go基础还是比较差,一些基本的东西还是了解不多,所以我想重新过一下go语言,这个系列博客就是为了记录一下自己的学习路径,同时方便自己回顾,在此感谢大家的翻译《the way to go》和无闻大大。 笔记目录 Go语言学习笔记(一)------目录 Go语言学习笔记(二)------Go的基本结构和要素 Go语言学习笔记(三)------控制结构 Go语言学习笔记...

Rcvisual的博客 791

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Go学习笔记

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言第一阶段:Go语言编程基础入门一 初识Go语言Go开发环境搭建第一个Go程序Go命令介绍二 基础语法标识符与关键字操作符与表达式变量、常量、字面量变量作用域注释与Go DOC三 基础数据类型布尔整型浮点型枚举指针自定义类型三 复合数据类型数组切片MAP管道四 结构体结构体定义结

林长有的博客 2208

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

golang从0到1实战系统四十六:访问数据库

以兼容几乎所有支持 database/sql 的数据库驱动,可以方便的使用 Go style 来进行数据库。Go 没有内置的驱动支持任何的数据库,但是 Go 定义了 database/sql 接口,用户可以基于。用 init 函数,然后在 init 函数里面注册这个数据库驱动,这样我们就可以在接下来的代码中。这个存在于 database/sql 的函数是用来注册数据库驱动的,当第三方开发者开发数据库驱。驱动接口开发相应数据库的驱动,5.1 小节里面介绍 Go 设计的一些驱动,介绍 Go 是如何。

Mr_Roki的博客 351

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Go语言入门心法(十四) Go操作Redis实战(2),2024年最新HTTPS面试常问全解析

所以就有了连接池的概念,在初始化时,创建一定数量的连接,先把所有连接存起来,然后,谁需要使用,从这里取走,干完活立马放回来。一个数据库服务器只拥有有限的连接资源,一旦所有的连接资源都在使用,那么其它需要连接的资源就只能等待释放连接资源。所以,在连接资源有限的情况下,提高单位时间的连接的使用效率,缩短连接时间,就能显著缩短请求时间。很明显,重复创建连接 关闭连接这样的消耗是可以节省。MaxIdle:最大的空闲连接数,表示即使没有redis连接时依然可以保持N个空闲的连接,而不被清除,随时处于待命状态。

2401_84265866的博客 713

Go最全Go语言入门心法(十四) Go操作Redis实战(4),送给正在迷茫的你

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新如果你需要这些资料,可以戳这里获取Go语言入门心法(十六):Go远程过程调用框架GRPC实战:Go远程过程调用框架GRPC实战")go操作redis客户端官网推荐: go-redis客户端详细文档 运行效果: 运行效果:一个数据库服务器只拥有有

2401_84925284的博客 694

Go语言入门心法(十四): Go操作Redis实战

go语言认知升维 go语言中反射 go语言认知心法 10天带你遍游go入门法

天涯芳草 542

Go 连接 Redis 代码详细解析

创建 Redis 客户端↓连接 Redis↓发送 PING 测试↓返回 PONGrdb 是 Redis 操作对象ctx 是上下文Options 是连接配置Ping 用于测试连接。

lihaoweiwudi_的博客 608

[go学习笔记.第十六章.TCP编程] 3.项目-海量用户即时通讯系统-redis介入,用户登录,注册

项目-海量用户即时通讯系统-redis介入,用户登录,注册

资深系统架构,深耕高并发研发与 AI 大模型工程化落地。技术栈以 Python (AI/NLP/RAG/Agent) 与 Golang (高并发架构) 为双核心,兼具 PHP 大型应用经验。专注算法落地、复杂系统设计及团队技术赋能 1042

【Go】格式化字符串指令大全 && Redis常用命令

【Go】格式化字符串指令大全 && Redis常用命令原创:@As.Kai。

Welcome To As.Kai 's Home 747

Go语言入门心法(十六):Go远程过程调用框架GRPC实战

go语言认知升维 go语言中反射 go语言认知心法 10天带你遍游go入门法

天涯芳草 487

go-zero学习 Mikaelemmmm的视频讲解整理

go-zero学习 Mikaelemmmm的视频讲解整理

Mr_XiMu的博客 1978

[深入理解Redis]读取RDB文件

最近在做一个解析rdb文件的功能,途中遇到了一些问题,也解决了一些问题。具体为什么要做这件事情之后再详谈,本次主要想聊聊遇到的开始处理文件时遇到的第一个难题:理解RDB文件的协议、如何读取二进制文件。 RDB文件 [Redis源码阅读]redis持久化文章介绍过,Redis的持久化是通过RDB和AOF实现的。Redis的RDB文件是二进制...

weixin_33978016的博客 1万+

go-zero(十六)结合Canal :实现高效数据同步与处理

Canal是阿里巴巴开源的一款数据库binlog增量订阅&消费的中间件,最初用于MySQL数据库主从复制协议解析。它能够模拟MySQLslave获取binlog并解析为结构化的数据,广泛应用于数据同步、实时数据处理等场景。

Clown95 1606

字节、腾讯、金山wps、跟谁学、百度 go工程师面试题集锦

字节 1 go channel close后读的问题 2 Linux grep命令查找日志文件相关内容 3 B+树结构 and 为什么 4 io多路复用,epoll和select的区别 5 计网七层协议、线程进程区别 6 线程怎么调度 7 进程通信方法 8 tcp 保证可靠性 9 go slice 和 array 区别 10 GMP 模型 11 分布式缓存框架,singleflight 并发,深挖,一直挖到sync.WaitGroup 12 缓存击穿 缓存雪崩 13 sync.WaitGroup 14

吾非同 669
上一篇: Go语言学习笔记(十五)------数据库MySQL学习笔记
下一篇: Kubernetes学习笔记(一)------目录
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值