热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

redis学习_Redis学习笔记(第二部分:Redis基础)

写在开头:本章是Redis学习归纳第二部分,着重于归纳redis的基础知识。文章内容输出来源:拉勾教育大数据高薪训练营。Redis介绍Re
2dfb970b01b9b571da96bf46c58aabf2.png

写在开头:

本章是Redis学习归纳第二部分,着重于归纳redis的基础知识。

文章内容输出来源:拉勾教育大数据高薪训练营。

Redis介绍

  1. Redis (Remote Dictionary Server)远程字典服务器,是用C语言开发的一个开源的高性能键值对( key-value )内存数据库
  2. 它提供了五种数据类型来存储值:字符串类型、散列类型、列表类型、集合类型、有序集合类型
  3. 它是一种 NoSQL 数据存储。

Redis应用场景

  1. 缓存使用,减轻DB压力
  2. DB使用,用于临时存储数据(字典表,购买记录)
  3. 解决分布式场景下Session分离问题(登录信息)
  4. 任务队列(秒杀、抢红包等等) 乐观锁
  5. 应用排行榜 zset
  6. 签到 bitmap
  7. 分布式锁
  8. 冷热数据交换

Redis数据类型

Redis是一个Key-Value的存储系统,使用ANSI C语言编写。

key的类型是字符串。

value的数据类型有:

  • 常用的:string字符串类型、list列表类型、set集合类型、sortedset(zset)有序集合类型、hash类型。
  • 不常见的:bitmap位图类型、geo地理位置类型

Redis的Key的设计

1.可以将key值以冒号分割

2.把表名转换为Key的前缀,冒号后放表的主键,第三段放列名

比如:用户表user, 转换为redis的key-value存储

d9b19667648c1ff2f2d5b21bb6f2e9eb.png

那么username 的 key就是: user:9:username

email的key:user:9:email

表示明确:看key知道意思 ,不易被覆盖

string字符串类型

命令名称使用方式命令描述
setset key value赋值
getget key取值
getsetgetset key value取值并赋值
setnxsetnx key value当value不存在时采用赋值
set key value NX PX 3000 原子操作,px 设置毫秒数
appendappend key value向尾部追加值
strlenstrlen key获取字符串长度
incrincr key递增数字
incrbyincrby key increment增加指定的整数
decrdecr key递减数字
decrbydecrby key decrement减少指定的整数

应用场景:

1、key和命令是字符串

2、普通的赋值

3、incr用于乐观锁

incr:递增数字,可用于实现乐观锁 watch(事务)

4、setnx用于分布式锁

当value不存在时采用赋值,可用于实现分布式锁

list列表类型

list列表类型可以存储有序、可重复的元素,获取头部或尾部附近的记录是极快的,list的元素个数最多为2^32-1个(40亿)

命令名称命令格式描述
lpushlpush key v1 v2 v3从左侧插入列表
lpoplpop key从列表左侧取出
rpushrpush key v1 v2 v3从右侧插入列表
rpoprpop key从列表右侧取出
lpushxlpushx key value将值插入到列表头部
rpushxrpushx key value将值插入到列表尾部
blpopblpop key
timeout
从列表左侧取出,当列表为空时阻塞,可以设置最大阻塞时
间,单位为秒
brpopblpop key
timeout
从列表右侧取出,当列表为空时阻塞,可以设置最大阻塞时
间,单位为秒
llenllen key获得列表中元素个数
lindexlindex key
index
获得列表中下标为index的元素 index从0开始
lrangelrange key
start end
返回列表中指定区间的元素,区间通过start和end指定
lremlrem key count
value
删除列表中与value相等的元素,当count>0时&#xff0c; lrem会从列表左边开始删除;d当count<0时,lrem会从列表后边开始删除;当count&#61;0时&#xff0c; lrem删除所有值为value的元素
lsetlset key index
value
将列表index位置的元素设置成value的值
ltrimltrim key start
end
对列表进行修剪&#xff0c;只保留start到end区间
rpoplpushrpoplpush
key1 key2
从key1列表右侧弹出并插入到key2列表左侧
brpoplpushbrpoplpush
key1 key2
从key1列表右侧弹出并插入到key2列表左侧&#xff0c;会阻塞
linsertlinsert key
BEFORE/AFTERpivot value
将value插入到列表&#xff0c;且位于值pivot之前或之后

应用场景&#xff1a;

1、作为栈或队列使用

列表有序可以作为栈和队列使用

2、可用于各种列表&#xff0c;比如用户列表、商品列表、评论列表等。

使用案例&#xff1a;

7103c2b1aee181b5e1728a39af83397a.png
a7d2e20436342da5f33a8cde4b3b1ad0.png
546487712fcfe024b3755916448d7077.png
fae89f1ccee7ab3f0cd6349e39c3f3af.png
14006d2fbae6e8ce3591f897538105e0.png
d1a64802d209d2ae966f2119ce82a2db.png

set集合类型

Set&#xff1a;无序、唯一元素

集合中最大的成员数为 2^32 - 1

常见操作命令如下表&#xff1a;

命令名称命令格式描述
saddsadd key mem1 mem2 ....为集合添加新成员
sremsrem key mem1 mem2 ....删除集合中指定成员
smemberssmembers key获得集合中所有元素
spopspop key返回集合中一个随机元素&#xff0c;并将该元素删除
srandmembersrandmember key返回集合中一个随机元素&#xff0c;不会删除该元素
scardscard key获得集合中元素的数量
sismembersismember key member判断元素是否在集合内
sintersinter key1 key2 key3求多集合的交集
sdiffsdiff key1 key2 key3求多集合的差集
sunionsunion key1 key2 key3求多集合的并集

应用场景&#xff1a;

适用于不能重复的且不需要顺序的数据结构

比如&#xff1a;关注的用户&#xff0c;还可以通过spop进行随机抽奖

32ec2c96802d51fabdefd33e369ea782.png

sortedset有序集合类型

SortedSet(ZSet) 有序集合&#xff1a; 元素本身是无序不重复的

每个元素关联一个分数(score)

可按分数排序&#xff0c;分数可重复

常见操作命令如下表&#xff1a;

名称格式含义
zaddzadd key score1 member1 score2
member2 ..
为有序集合添加新成员
zremzrem key mem1 mem2 ....删除有序集合中指定成员
zcardzcard key获得有序集合中的元素数量
zcountzcount key min max返回集合中score值在[min,max]区间
的元素数量
zincrbyzincrby key increment member在集合的member分值上加increment
zscorezscore key member获得集合中member的分值
zrankzrank key member获得集合中member的排名&#xff08;按分值从
小到大&#xff09;
zrevrankzrevrank key member获得集合中member的排名&#xff08;按分值从
大到小&#xff09;
zrangezrange key start end获得集合中指定区间成员&#xff0c;按分数递增排序
zrevrangezrevrange key start end获得集合中指定区间成员&#xff0c;按分数递减排序

应用场景&#xff1a;

由于可以按照分值排序&#xff0c;所以适用于各种排行榜。比如&#xff1a;点击排行榜、销量排行榜、关注排行榜等。

5c4f7065b70825b50c2efe3dde256d95.png

Hash类型&#xff08;散列表&#xff09;

Redis hash 是一个 string 类型的 field 和 value 的映射表&#xff0c;它提供了字段和字段值的映射。

每个 hash 可以存储 2^32 - 1 键值对&#xff08;40多亿&#xff09;

1bc5fd56dae679d1e018c3d101b495e6.png
名称格式含义
hsethset key field value赋值&#xff0c;不区别新增或修改
hmsethmset key field1 value1 field2 value2批量赋值
hsetnxhsetnx key field value赋值&#xff0c;如果filed存在则不操作
hexistshexists key filed查看某个field是否存在
hgethget key field获取一个字段值
hmgethmget key field1 field2 ...获取多个字段值
hgetallhgetall key获取全部key-value
hdelhdel key field1 field2...删除指定字段
hincrbyhincrby key field increment指定字段自增increment
hlenhlen key获得字段数量
fd35ada01030c5b806f89a71dec81072.png

bitmap位图类型

bitmap是进行位操作的

通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。

bitmap本身会极大的节省储存空间。

常见操作命令如下表

名称格式描述
setbitsetbit key offset value设置key在offset处的bit值(只能是0或者
1)。
getbitgetbit key offset获得key在offset处的bit值
bitcountbitcount key获得key的bit位为1的个数
bitposbitpos key value返回第一个被设置为bit值的索引值
bitopbitop and[or/xor/not] destkey key
[key …]
对多个key 进行逻辑运算后存入destkey

应用场景&#xff1a;

1、用户每月签到&#xff0c;用户id为key &#xff0c; 日期作为偏移量 1表示签到

2、统计活跃用户, 日期为key&#xff0c;用户id为偏移量 1表示活跃

3、查询用户在线状态&#xff0c; 日期为key&#xff0c;用户id为偏移量 1表示在线

4165409e67f24a1fc3edd429a57b8c38.png
64f6ce2773b9eae3f708446ee0713fc6.png

geo地理位置类型

geo是Redis用来处理位置信息的。在Redis3.2中正式使用。主要是利用了Z阶曲线、Base32编码和geohash算法

Z阶曲线

在x轴和y轴上将十进制数转化为二进制数&#xff0c;采用x轴和y轴对应的二进制数依次交叉后得到一个六位数编

码。把数字从小到大依次连起来的曲线称为Z阶曲线&#xff0c;Z阶曲线是把多维转换成一维的一种方法。

1a8e154de40fb058c542340dd4ceb4c6.png

Base32编码

Base32这种数据编码机制&#xff0c;主要用来把二进制数据编码成可见的字符串&#xff0c;其编码规则是&#xff1a;任意给定一个二进制数据&#xff0c;以5个位(bit)为一组进行切分(base64以6个位(bit)为一组)&#xff0c;对切分而成的每个组进行编码得到1个可见字符。Base32编码表字符集中的字符总数为32个&#xff08;0-9、b-z去掉a、i、l、o&#xff09;&#xff0c;这也是Base32名字的由来。

geohash算法

Gustavo在2008年2月上线了http://geohash.org网站。Geohash是一种地理位置信息编码方法。 经过geohash映射后&#xff0c;地球上任意位置的经纬度坐标可以表示成一个较短的字符串。可以方便的存储在数据库中&#xff0c;附在邮件上&#xff0c;以及方便的使用在其他服务中。以北京的坐标举例&#xff0c;[39.928167,116.389550]可以转换成 wx4g0s8q3jf9 。

Redis中经纬度使用52位的整数进行编码&#xff0c;放进zset中&#xff0c;zset的value元素是key&#xff0c;score是GeoHash的52位整数值。在使用Redis进行Geo查询时&#xff0c;其内部对应的操作其实只是zset(skiplist)的操作。通过zset的score进行排序就可以得到坐标附近的其它元素&#xff0c;通过将score还原成坐标值就可以得到元素的原始坐标

177b494c867858c7d816ff5c874534df.png

应用场景

1、记录地理位置

2、计算距离

3、查找"附近的人"

085bd597fd1bbe9eba359c9eb9d259cc.png
1b031616d9318686afcd7cc4009903c9.png
fdf98c41f5efcb85665c3245f6764170.png

缓存过期和淘汰策略

Redis性能高&#xff1a;

官方数据

读&#xff1a;110000次/s

写&#xff1a;81000次/s

长期使用&#xff0c;key会不断增加&#xff0c;Redis作为缓存使用&#xff0c;物理内存也会满

内存与硬盘交换&#xff08;swap&#xff09; 虚拟内存 &#xff0c;频繁IO 性能急剧下降

maxmemory

不设置的场景

Redis的key是固定的&#xff0c;不会增加

Redis作为DB使用&#xff0c;保证数据的完整性&#xff0c;不能淘汰 &#xff0c; 可以做集群&#xff0c;横向扩展

缓存淘汰策略&#xff1a;禁止驱逐 &#xff08;默认&#xff09;

设置的场景

Redis是作为缓存使用&#xff0c;不断增加Key

maxmemory &#xff1a; 默认为0 不限制

问题&#xff1a;达到物理内存后性能急剧下架&#xff0c;甚至崩溃

内存与硬盘交换&#xff08;swap&#xff09; 虚拟内存 &#xff0c;频繁IO 性能急剧下降

设置多少&#xff1f;

与业务有关

1个Redis实例&#xff0c;保证系统运行 1 G &#xff0c;剩下的就都可以设置Redis

物理内存的3/4

在redis.conf中

maxmemory 1024mb

命令&#xff1a; 获得maxmemory数

CONFIG GET maxmemory

设置maxmemory后&#xff0c;当趋近maxmemory时&#xff0c;通过缓存淘汰策略&#xff0c;从内存中删除对象

不设置maxmemory &#xff0c;无最大内存限制 maxmemory-policy noeviction &#xff08;禁止驱逐&#xff09; 不淘汰

设置maxmemory maxmemory-policy 要配置

expire数据结构

在Redis中可以使用expire命令设置一个键的存活时间(ttl: time to live)&#xff0c;过了这段时间&#xff0c;该键就会自动被删除。

6ec5176cb6934c8b05e3904e18a33dc0.png

expire原理

64da8349a39cc8ec1bdb9670581628bf.png

上面的代码是Redis 中关于数据库的结构体定义&#xff0c;这个结构体定义中除了 id 以外都是指向字典的指针&#xff0c;其中我们只看 dict 和 expires

dict 用来维护一个 Redis 数据库中包含的所有 Key-Value 键值对&#xff0c;expires则用于维护一个 Redis 数据库中设置了失效时间的键(即key与失效时间的映射)。

当我们使用 expire命令设置一个key的失效时间时&#xff0c;Redis 首先到 dict 这个字典表中查找要设置的key是否存在&#xff0c;如果存在就将这个key和失效时间添加到 expires 这个字典表。

当我们使用 setex命令向系统插入数据时&#xff0c;Redis 首先将 Key 和 Value 添加到 dict 这个字典表中&#xff0c;然后将 Key 和失效时间添加到 expires 这个字典表中。

简单地总结来说就是&#xff0c;设置了失效时间的key和具体的失效时间全部都维护在 expires 这个字典表中。

删除策略

Redis的数据删除有定时删除、惰性删除和主动删除三种方式。

Redis目前采用惰性删除&#43;主动删除的方式。

定时删除

在设置键的过期时间的同时&#xff0c;创建一个定时器&#xff0c;让定时器在键的过期时间来临时&#xff0c;立即执行对键的删除操作。需要创建定时器&#xff0c;而且消耗CPU&#xff0c;一般不推荐使用。

惰性删除

在key被访问时如果发现它已经失效&#xff0c;那么就删除它。

调用expireIfNeeded函数&#xff0c;该函数的意义是&#xff1a;读取数据之前先检查一下它有没有失效&#xff0c;如果失效了就删除它。

f7f36751752d0a3f41198fcab9359fb0.png

主动删除

在redis.conf文件中可以配置主动删除策略,默认是no-enviction&#xff08;不删除)

maxmemory-policy allkeys-lru

LRU

LRU (Least recently used) 最近最少使用&#xff0c;算法根据数据的历史访问记录来进行淘汰数据&#xff0c;其核心思想是“如果数据最近被访问过&#xff0c;那么将来被访问的几率也更高"。

最常见的实现是使用一个链表保存缓存数据&#xff0c;详细算法实现如下&#xff1a;

1. 新数据插入到链表头部&#xff1b;

2. 每当缓存命中&#xff08;即缓存数据被访问&#xff09;&#xff0c;则将数据移到链表头部&#xff1b;

3. 当链表满的时候&#xff0c;将链表尾部的数据丢弃。

4. 在Java中可以使用LinkHashMap&#xff08;哈希链表&#xff09;去实现LRU

让我们以用户信息的需求为例&#xff0c;来演示一下LRU算法的基本思路&#xff1a;

1.假设我们使用哈希链表来缓存用户信息&#xff0c;目前缓存了4个用户&#xff0c;这4个用户是按照时间顺序依次从链表右端插入的

45a19490ebd11658e20ed7a8c590f9e3.png

2.此时&#xff0c;业务方访问用户5&#xff0c;由于哈希链表中没有用户5的数据&#xff0c;我们从数据库中读取出来&#xff0c;插入到缓存当中。这时候,链表中最右端是最新访问到的用户5,最左端是最近最少访问的用户1。

ea25198862ba046f76c0ca268b173d73.png

3..接下来&#xff0c;业务方访问用户2&#xff0c;哈希链表中存在用户2的数据&#xff0c;我们怎么做呢&#xff1f;我们把用户2从它的前驱节点和后继节点之间移除&#xff0c;重新插入到链表最右端。这时候&#xff0c;链表中最右端变成了最新访问到的用户2&#xff0c;最左端仍然是最近最少访问的用户1。

5980a105e95e9edad53d1d661da4f406.png

4.接下来&#xff0c;业务方请求修改用户4的信息。同样道理&#xff0c;我们把用户4从原来的位置移动到链表最右侧&#xff0c;并把用户信息的值更新。这时候&#xff0c;链表中最右端是最新访问到的用户4&#xff0c;最左端仍然是最近最少访问的用户1。

fa19075dff0800fd55edc31ccce7cbcb.png

5.业务访问用户6&#xff0c;用户6在缓存里没有&#xff0c;需要插入到哈希链表。假设这时候缓存容量已经达到上限&#xff0c;必须先删除最近最少访问的数据&#xff0c;那么位于哈希链表最左端的用户1就会被删除掉&#xff0c;然后再把用户6插入到最右端。

4ee9c0e44a008dde5de1bb40b696796f.png

Redis的LRU 数据淘汰机制

在服务器配置中保存了 lru 计数器 server.lrulock&#xff0c;会定时&#xff08;redis 定时程序 serverCorn()&#xff09;更新&#xff0c;server.lrulock 的值是根据 server.unixtime 计算出来的。

另外&#xff0c;从 struct redisObject 中可以发现&#xff0c;每一个 redis 对象都会设置相应的 lru。可以想象的是&#xff0c;每一次访问数据的时候&#xff0c;会更新 redisObject.lru。

LRU 数据淘汰机制是这样的&#xff1a;在数据集中随机挑选几个键值对&#xff0c;取出其中 lru 最大的键值对淘汰。

不可能遍历key 用当前时间-最近访问 越大 说明 访问间隔时间越长

volatile-lru

从已设置过期时间的数据集&#xff08;server.db[i].expires&#xff09;中挑选最近最少使用的数据淘汰

allkeys-lru

从数据集&#xff08;server.db[i].dict&#xff09;中挑选最近最少使用的数据淘汰

LFU

LFU (Least frequently used) 最不经常使用&#xff0c;如果一个数据在最近一段时间内使用次数很少&#xff0c;那么在将来一段时间内被使用的可能性也很小。

可以配置&#xff1a;

volatile-lfu

allkeys-lfu

random

随机

volatile-random

从已设置过期时间的数据集&#xff08;server.db[i].expires&#xff09;中任意选择数据淘汰

allkeys-random

从数据集&#xff08;server.db[i].dict&#xff09;中任意选择数据淘汰

ttl

volatile-ttl

从已设置过期时间的数据集&#xff08;server.db[i].expires&#xff09;中挑选将要过期的数据淘汰

redis 数据集数据结构中保存了键值对过期时间的表&#xff0c;即 redisDb.expires

TTL 数据淘汰机制&#xff1a;从过期时间的表中随机挑选几个键值对&#xff0c;取出其中 ttl 最小的键值对淘汰

noenviction

禁止驱逐数据&#xff0c;不删除 默认

缓存淘汰策略的选择

allkeys-lru &#xff1a; 在不确定时一般采用策略。 冷热数据交换

volatile-lru &#xff1a; 比allkeys-lru性能差 存 : 过期时间

allkeys-random &#xff1a; 希望请求符合平均分布(每个元素以相同的概率被访问)

自己控制&#xff1a;volatile-ttl 缓存穿透

案例

字典库 &#xff1a; Redis做DB使用&#xff0c;要保证数据的完整性

maxmemory设置较小&#xff0c;采用allkeys-lru&#xff0c;会对没有经常访问的字典库随机淘汰

当再次访问时会缓存击穿&#xff0c;请求会打到DB上。

解决方案&#xff1a;

1、不设置maxmemory

2、使用noenviction策略

Redis是作为DB使用的&#xff0c;要保证数据的完整性&#xff0c;所以不能删除数据。

可以将原始数据源&#xff08;XML&#xff09;在系统启动时一次性加载到Redis中。

Redis做主从&#43;哨兵 保证高可用



推荐阅读
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 开发心得:利用 Redis 构建分布式系统的轻量级协调机制
    开发心得:利用 Redis 构建分布式系统的轻量级协调机制 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • B站服务器故障影响豆瓣评分?别担心,阿里巴巴架构师分享预防策略与技术方案
    13日晚上,在视频观看高峰时段,B站出现了服务器故障,引发网友在各大平台上的广泛吐槽。这一事件导致了连锁反应,大量用户纷纷涌入A站、豆瓣和晋江等平台,给这些网站带来了突如其来的流量压力。为了防止类似问题的发生,阿里巴巴架构师分享了一系列预防策略和技术方案,包括负载均衡、弹性伸缩和容灾备份等措施,以确保系统的稳定性和可靠性。 ... [详细]
  • 在《Linux高性能服务器编程》一书中,第3.2节深入探讨了TCP报头的结构与功能。TCP报头是每个TCP数据段中不可或缺的部分,它不仅包含了源端口和目的端口的信息,还负责管理TCP连接的状态和控制。本节内容详尽地解析了TCP报头的各项字段及其作用,为读者提供了深入理解TCP协议的基础。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • REST与RPC:选择哪种API架构风格?
    在探讨REST与RPC这两种API架构风格的选择时,本文首先介绍了RPC(远程过程调用)的概念。RPC允许客户端通过网络调用远程服务器上的函数或方法,从而实现分布式系统的功能调用。相比之下,REST(Representational State Transfer)则基于资源的交互模型,通过HTTP协议进行数据传输和操作。本文将详细分析两种架构风格的特点、适用场景及其优缺点,帮助开发者根据具体需求做出合适的选择。 ... [详细]
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • 本文深入探讨了 Git 与 SVN 的高效使用技巧,旨在帮助开发者轻松应对版本控制中的各种挑战。通过详细解析两种工具的核心功能与最佳实践,读者将能够更好地掌握版本管理的精髓,提高开发效率。 ... [详细]
author-avatar
李浩
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有