厦门有什么网站设计公司,wordpress4.9.6 备案,沈阳做网站培训,谷歌浏览器 安卓下载2023版官网前言:
本来是基于scrapy-redis进行讲解的,需要拓展一下redis; 包含用法,设计,高并发,阻塞等; 要应用到爬虫开发中,这些基础理论我觉得还是有必要了解一下;
所以,新开一栏! 把redis这个环节系统补上,再转回去scrapy-redis才好深入; 正文:
Redis是一种内存数据库#xff0c…前言:
本来是基于scrapy-redis进行讲解的,需要拓展一下redis; 包含用法,设计,高并发,阻塞等; 要应用到爬虫开发中,这些基础理论我觉得还是有必要了解一下;
所以,新开一栏! 把redis这个环节系统补上,再转回去scrapy-redis才好深入; 正文:
Redis是一种内存数据库以其快速的性能、丰富的功能和对多种编程语言的支持而闻名。它提供了多种数据结构、持久化、简单易用、可靠性高和分布式能力。
首先Redis的速度非常快。它可以处理高达10万次每秒的读写操作这使得它具有出色的性能。这主要得益于Redis将数据存储在内存中而内存操作速度非常快。此外Redis是用C语言实现的这也有助于提供出色的性能。它采用单线程的线程模型这保证了操作的原子性避免了并发问题。
除了速度快之外Redis还具有持久化功能。它将所有的数据保存在内存中并异步地将数据更新到磁盘中以保证数据的持久性。这意味着即使在发生系统故障或重启时数据也不会丢失。
Redis提供了多种数据结构它基于键值对进行存储。其中值可以是字符串、二进制对象、位图、哈希表、链表、集合和有序集合等。这些不同的数据结构可以适应不同的应用场景例如缓存、计数器、分布式锁等。
另一个值得注意的特点是Redis支持多种编程语言。它提供了丰富的API可以与多种编程语言进行交互如Java、Python、PHP等。这使得开发者可以方便地使用Redis来构建各种应用系统。
Redis还具备丰富的功能。它支持发布订阅模式可以实现消息的广播和订阅机制。通过使用Lua脚本开发者可以在Redis中执行复杂的操作和业务逻辑。另外Redis还支持事务和管道操作可以批量执行多个命令提高操作效率。
Redis的简单易用也是其优点之一。它提供了一套简洁而直观的命令集如get、set、del等。通过这些基本命令可以轻松地对Redis中的数据进行读取、写入和删除操作。
另外Redis提供了主从复制功能可以实现数据的备份和故障恢复。它还支持高可用性和分布式部署可以构建具有弹性和扩展性的系统。
在使用Redis时了解其API的使用和理解非常重要。Redis提供了通用的命令集如keys、dbsize、exists、del、expire、type等。通过这些命令可以操作和管理Redis中的键和值例如查看键的数量、判断键是否存在、设置键的过期时间、删除键等。
需要注意的是Redis采用单线程架构虽然单线程模型非常快速但也意味着在处理长时间的命令如keys、flushall、mutil等时会阻塞其他命令的执行因此在实际使用中要避免使用这些长时间的命令以提高整体性能。
此外了解Redis的内部数据结构和编码方式也很重要。对外Redis使用一种数据结构表示数据类型如字符串、哈希表、列表、集合、有序集合和无类型。而在内部Redis使用了不同的编码方式如原始编码、整型编码、压缩列表、链接列表、哈希映射和整数集合等。了解这些内部实现细节可以更好地理解Redis的工作原理和优化使用。 字符串(str):
字符串类型是Redis中常用的数据类型之一。它可以用于存储字符串、JSON等数据但要注意value的最大大小不超过512M。字符串类型在缓存、计数器和分布式锁等场景中非常有用。下面介绍字符串类型的基本命令以及一些拓展命令并结合案例进行讲解。
字符串类型的基本命令
其中get命令用于获取指定键的值set命令用于设置键的值del命令用于删除指定键。例如我们可以使用以下命令来设置和获取键haha的值
127.0.0.1:6379 set haha 1
OK
127.0.0.1:6379 get haha
1应用:
缓存字符串类型是缓存系统中最常见的数据类型。使用get和set命令可以轻松地从缓存中获取和设置键值对实现快速数据访问和存储。 incr、decr、incrby和decrby
这些命令常用于统计数据和缓存sql语句等场景。
incr命令用于将键对应的值自增1如果键不存在则会先将键的值设置为0再进行自增decr命令类似地将键对应的值自减1incrby和decrby命令可以指定自增或自减的步长。
127.0.0.1:6379 incr haha
(integer) 2
127.0.0.1:6379 get haha
2应用:
计数器通过使用incr、decr、incrby和decrby命令可以实现计数器的功能。例如可以将键的值设置为初始值然后使用incr命令对其进行自增操作从而实现对某个数据进行计数。 set命令
可以设置键的值不管键是否已存在
setnx命令只在键不存在时进行设置并返回0或1来表示是否设置成功set命令还有一个额外的参数xx表示只有键存在时才进行设置用于更新值。
让我们看一个示例
127.0.0.1:6379 set foo bar
OK
127.0.0.1:6379 setnx foo baz
(integer) 0
127.0.0.1:6379 set foo baz xx
OK在上面的示例中首先使用set命令将键foo的值设置为bar然后使用setnx命令在键foo不存在时将其值设置为baz但因为键已存在所以返回结果为0最后使用set命令将键foo的值由bar更新为baz。
应用:
分布式锁字符串类型在实现分布式锁时非常有用。通过setnx命令可以尝试在分布式环境中获取锁。如果返回值为1则表示获取锁成功如果返回值为0则表示锁已被其他客户端占用。 批量操作的命令:mget / mset
mget命令可以一次性获取多个键的值而mset命令则可以一次性设置多个键值对。
这些批量操作可以节省时间开销提高效率。
127.0.0.1:6379 mset foo1 bar1 foo2 bar2 foo3 bar3
OK
127.0.0.1:6379 mget foo1 foo2 foo3
1) bar1
2) bar2
3) bar3在上面的示例中我们使用mset命令一次性设置了三个键值对然后使用mget命令一次性获取了这三个键的值。
应用:
JSON存储字符串类型可用于存储和传输JSON格式的数据。使用get、set和mget等命令可以轻松地获取和设置JSON字符串而无需进行复杂的序列化和反序列化操作。 操作字符串类型: getset / append /strlen
getset命令可以获取键的旧值并设置新的值append命令可以在键的值末尾追加新的值并返回新的长度strlen命令可以获取键的值的长度。
127.0.0.1:6379 getset foo baz
bar
127.0.0.1:6379 append foo 123
(integer) 6
127.0.0.1:6379 strlen foo
(integer) 6在上面的示例中首先使用getset命令获取键foo的旧值bar并设置新值baz然后使用append命令将123追加到键foo的值之后最后使用strlen命令获取键foo的值的长度为6。
应用:
串联操作使用append命令可以将字符串值进行追加。这在处理日志记录、事件追踪等场景中非常有用。 字符串数据类型: incrbyfloat、getrange和setrange。
这些命令可以帮助我们更灵活地操作字符串值。
首先incrbyfloat命令可用于将存储为浮点数的键的值与给定的浮点数相加。如果键的值不是浮点数Redis会将其转换为0并执行加法操作。下面是一个示例
127.0.0.1:6379 incr fudian
(integer) 1
127.0.0.1:6379 incrbyfloat fudian 1.85
2.85000000000000009在上面的示例中我们首先使用incr命令将键fudian的值自增1然后使用incrbyfloat命令将键fudian的值与给定的1.85相加得到新的值2.85000000000000009。注意Redis中的浮点数实际上都以字符串形式存储。 接下来我们来了解getrange和setrange命令。
getrange命令可以返回键的值中指定位置范围内的子字符串。它需要指定起始位置和结束位置的索引。
127.0.0.1:6379 getrange ba 0 3
,daw在上面的示例中我们使用getrange命令获取键ba的值中从索引0到3的子字符串结果是,daw。
setrange命令用于替换键的值中指定索引范围内的字符或子字符串。它需要指定起始位置索引和替换的新字符串。
127.0.0.1:6379 setrange ba 3 a
(integer) 9
127.0.0.1:6379 get ba
,daaoerzi在上面的示例中我们使用setrange命令将键ba的值中索引为3的字符替换为a最终值变为,daaoerzi。需要注意的是setrange会自动扩展字符串长度以容纳替换的内容。
应用: 获取子字符串通过getrange命令可以轻松地获取字符串值中指定范围的子字符串。这在需要处理文本数据的场景中非常有用。 字符串替换setrange命令可以指定字符串值中的位置并将指定范围的字符替换为新的字符串。这对于实现特定格式的文本处理非常有用。