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>

 

MOS管开关设计知识-(五种MOS管开关电路图方式) 在使用MOS管设计开关电源或者马达驱动电路的时候,大部分人都会考虑MOS的导通电阻,最大电压等,最大电流等,也有很多人仅仅考虑这些因素。这样的电路也许是可以工作的,但并不是优秀的,作为正式的产品设计也是不允许的。 下面是我对MOSFET及MOSFET驱动电路基础的一点总结,其中参考了一些资料,非全部原创。包括MOS管的介绍,特性,驱动以及应用电路。 1、MOS管种类和结构 MOSFET管是FET的... 阅读详情

相关推荐

Ubuntu 24.04中文输入法终极指南:从安装到疑难排解

本文是Ubuntu 24.04中文输入法的完整指南,详细介绍了如何通过图形界面或命令行安装和配置Intelligent Pinyin输入法。内容涵盖IBus框架的运作原理、输入法快捷键调校、模糊音设置,并重点解决了Qt应用无法输入中文的疑难问题,最后提供了Fcitx5备选方案及常见故障的排解方法。

weixin_29294975的博客 1241

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

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

hjxisking的专栏 598

从零部署Stable Diffusion:本地环境搭建完整教程

本文专为“想自己跑Stable Diffusion但完全没经验”的新手设计,覆盖从硬件准备到生成第一张图的完整流程。不涉及复杂算法原理,但会讲清每个操作的“为什么”(比如为什么需要显卡?为什么要装CUDA?),帮你知其然更知其所以然。先检查硬件是否达标(显卡是核心!安装必要软件(操作系统、Python、CUDA)下载Stable Diffusion核心代码和模型解决常见报错,生成第一张图附赠模型库推荐和性能优化技巧显卡是核心:N卡+足够显存(至少6G)是本地部署的基础。CUDA是翻译。

AI算力网络与通信的博客 1291

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

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

大大的微笑的专栏 3万+

雷赛控制卡全方位使用指南:从硬件连接到高级应用

雷赛控制卡以其接口简单、编程便捷、性价比高的特点,成为中小自动化设备的理想选择。使用时需注意:硬件连接需注重抗干扰设计(屏蔽线、接地);软件开发需合理配置运动参数(脉冲当量、加减速);调试阶段需充分利用 DMCStudio 工具验证性能。通过本文介绍的方法,可快速实现从硬件搭建到复杂运动控制的全流程开发,满足雕刻、切割、装配等多场景的自动化需求。

品质生活,极致编程。 3770

Robocup 仿真2D 学习笔记(二) 球队代码编译和上场

环境的一些问题 最近在使用rcssserver 和 rcssmonitor时可能会遇到./configure失败的问题,可以检查一下文件夹是否有makefile文件,如果是编译后的包直接sudo make install,如果还不行,还可以源码下载编译 rcssserver: https://sourceforge.net/projects/sserver/files/rcssserver/...

markchalse的博客 6014

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

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

Seekload 2020

【王道训练营 C/C++方向基础 60 题(31-40)】

王道训练营 C/C++方向基础 60 题(31-40)

qq_55805517的博客 3067

Redis命令快速检索

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

janekeyzheng的专栏 1142

(二)使用VS2022克隆下载C++自制植物大战僵尸游戏教程

本文将介绍如何使用VS2022克隆下载《植物大战僵尸C++自制版本》。Gitee项目地址:Gitee仓库地址Github项目地址:Github仓库地址游戏官网地址(下载可直接运行)游戏官网。

尔灵尔亿的博客 4929

Python 爬虫进阶技巧:新手必学的反爬突破与效率优化

本文系统总结了爬虫进阶的核心技巧,针对新手常见的反爬拦截、效率低下、动态页面解析等痛点问题,提出了可落地的解决方案。主要内容包括:通过随机UA池、代理IP池和Cookie池突破常见反爬机制;利用多线程/异步请求提升爬取效率;使用Selenium解析动态渲染页面;以及数据清洗方法提升数据质量。文中提供了完整的代码示例和实战对比数据,并强调爬虫开发应遵守合规性要求。这些技巧能帮助开发者快速提升爬虫实战能力,应对80%以上的常见爬取需求。

2503_91057718的博客 1436

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

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

Rcvisual的博客 791

如何利用gretna软件计算脑网络全局属性(聚类系数,小世界属性,最短路径),局部属性指标(度,度分布,节点效率),如何理解网络稀疏度

grena工具箱被设计用于fMRI数据的图论网络分析。它是一套MATLAB函数和基于MATLAB的接口,用于常规的fMRI预处理,用于计算和统计分析最常用的网络指标,如小世界参数、效率、度、间性、关联性、层级性、同步性和模块化。......

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 9173

Go学习笔记

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

林长有的博客 2208

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

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

Mr_Roki的博客 351

android 蓝牙通讯demo

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

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

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

2401_84265866的博客 713

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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、付费专栏及课程。

余额充值