【Redis】Redis中常见的数据类型及其应用场景!

玄机-Linux权限维持-后门 阅读详情

五种常见数据类型

Redis中的数据类型指的是 value存储的数据类型,key都是以String类型存储的,value根据场景需要,可以以String、List等类型进行存储。

Java面试、学习文档、进阶路线、算法、架构资源

各数据类型介绍:

Redis数据类型对应的底层数据结构

String 类型的应用场景

常用命令

  • 存放键值:set key value [EX seconds] [PX milliseconds] [NX|XX]

    • [NX|XX] :

      • nx:如果key不存在则建立

      • xx:如果key存在则修改其值,也可以直接使用setnx/setex命令

  • 获取键值:get key

  • 值递增/递减:incr key

    • 如果字符串中的值是数字类型的,可以使用incr命令每次递增,不是数字类型则报错。
    • 一次想递增N用incrby命令,如果是浮点型数据可以用incrbyfloat命令递增。
    • 同样,递减使用decr、decrby命令。
  • 批量存放键值:mset key value [key value ...]

  • 批量获取键值:mget key [key ...]

  • 获取值长度:strlen key

  • 追加内容:append key value

  • 获取部分字符:getrange key start end

缓存对象

使用 String 来缓存对象有两种方式:

  • 直接缓存整个对象的 JSON,命令例子: SET user:1 '{"name":"seven", "age":18}'。
  • 采用将 key 进行分离为 user:ID:属性,采用 MSET 存储,用 MGET 获取各属性值,命令例子: MSET user:1:name seven1 user:1:age 18 user:2:name seven2 user:2:age 20

常规计数

比如计算访问次数、点赞、转发、库存数量等等。

highlighter- Markdown

# 初始化文章的阅读量
> SET aritcle:readcount:1001 0
OK
#阅读量+1
> INCR aritcle:readcount:1001
(integer) 1
#阅读量+1
> INCR aritcle:readcount:1001
(integer) 2

分布式锁

之所以采用Redis来作为分布式锁,可以有几方面理由:

  1. redis足够的快
  2. redis提供了setnx + expire的机制,完全契合分布式锁的实现要点
  3. Redisson客户端的流行,使得基于redis的分布式锁更加简单

SET 命令有个 NX 参数可以实现「key不存在才插入」,可以用它来实现分布式锁:

  • 如果 key 不存在,则显示插入成功,可以用来表示加锁成功;
  • 如果 key 存在,则会显示插入失败,可以用来表示加锁失败。

一般而言,还会对分布式锁加上过期时间,分布式锁的命令如下:

highlighter- SQL

SET lock_key unique_value NX PX 10000
  • lock_key 就是 key 键;
  • unique_value 是客户端生成的唯一的标识;
  • NX 代表只在 lock_key 不存在时,才对 lock_key 进行设置操作;
  • PX 10000 表示设置 lock_key 的过期时间为 10s,这是为了避免应用在运行过程中发生异常而无法释放锁。

共享 session 信息

通常情况下可以使用session信息保存用户的登录(会话)状态,由于这些 Session 信息会被保存在服务器端,如果用户一的 Session 信息被存储在服务器一,但第二次访问时用户一被分配到服务器二,这个时候服务器并没有用户一的 Session 信息,就会出现需要重复登录的问题。如下:

可以借助 Redis 对这些 Session 信息进行统一的存储和管理,这样无论请求发送到那台服务器,服务器都会去同一个 Redis 获取相关的 Session 信息,这样就解决了分布式系统下 Session 存储的问题。

List 类型的应用场景

常用命令

  • 存储值:

    • 左端存值:lpush key value [value ...]
    • 右端存值:rpush key value [value ...]
    • 索引存值:lset key index value
  • 弹出元素:

    • 左端弹出:lpop key
    • 右端弹出:rpop key
  • 获取元素个数:llen key

  • 获取列表元素:

    • 两边获取:lrange key start stop
    • 索引获取:lindex key index
  • 删除元素:

    • 根据值删除:lrem key count value
    • 范围删除:ltrim key start stop

消息队列

  • 消息保序:使用 LPUSH + RPOP,对队列进行先进先出的消息处理;满足消息队列的保序性
  • 阻塞读取:使用 BRPOP;阻塞读取队列中的数据,避免消费者不停地调用 RPOP 命令带了不必要的性能损失
  • 重复消息处理:生产者实现全局唯一 ID;满足消息队列的处理重复消息的能力
  • 消息的可靠性:使用 BRPOPLPUSH让消费者程序从一个 List 中读取消息,同时,Redis 会把这个消息再插入到另一个 List(可以叫作备份 List)留存;这样一来,如果消费者程序读了消息但没能正常处理,等它重启后,就可以从备份 List 中重新读取消息并进行处理了。满足消息队列的可靠性

但是有两个问题:

  1. 生产者需要自行实现全局唯一 ID;
  2. 不能以消费组形式消费数据

Hash 类型

常用命令

  • 存放值:

    • 单个:hset key field value
    • 多个:hmset key field value [field value ...]
    • 不存在时:hsetnx key field value
  • 获取字段值:

    • 单个:hget key field
    • 多个:hmget key field [field ...]
    • 获取所有键与值:hgetall key
    • 获取所有字段:hkeys key
    • 获取所有值:hvals key
  • 判断是否存在:hexists key field

  • 获取字段数量:hlen key

  • 递增/减:hincrby key field increment

  • 删除字段:hdel key field [field ...]

缓存对象

一般对象用 String + Json 存储,对象中某些频繁变化的属性可以考虑抽出来用 Hash 类型存储。

购物车

以用户 id 为 key,商品 id 为 field,商品数量为 value,恰好构成了购物车的3个要素,如下图所示。

涉及的命令如下:

  • 添加商品:HSET cart:{用户id} {商品id} 1
  • 添加数量:HINCRBY cart:{用户id} {商品id} 1
  • 商品总数:HLEN cart:
  • 删除商品:HDEL cart:
  • 获取购物车所有商品:HGETALL cart:

Set 类型

聚合计算(并集、交集、差集)场景,比如点赞、共同关注、抽奖活动等。

常用命令

  • 存储值:sadd key member [member ...]

  • 获取所有元素:smembers key

  • 随机获取:srandmember langs count

  • 判断是否存在某member:sismember key member

  • 获取集合中元素个数:scard key

  • 删除集合元素:srem key member [member ...]

  • 弹出元素:spop key [count]

点赞

可以保证一个用户只能点一个赞,已经点赞过的用户不能再点赞

highlighter- Bash

# uid:1 用户对文章 article:1 点赞
> SADD article:1 uid:1
(integer) 1
# uid:2 用户对文章 article:1 点赞
> SADD article:1 uid:2
(integer) 1
# uid:3 用户对文章 article:1 点赞
> SADD article:1 uid:3
(integer) 1

# uid:1 取消了对 article:1 文章点赞。
> SREM article:1 uid:1
(integer) 1

# 获取 article:1 文章所有点赞用户 :
> SMEMBERS article:1
1) "uid:3"
2) "uid:2"

# 获取 article:1 文章的点赞用户数量:
> SCARD article:1
(integer) 2

共同关注

Set 类型支持交集运算,所以可以用来计算共同关注的好友、公众号等。

key 可以是用户id,value 则是已关注的公众号的id。

highlighter- Bash

# uid:1 用户关注公众号 id 为 5、6、7、8、9
> SADD uid:1 5 6 7 8 9
(integer) 5
# uid:2  用户关注公众号 id 为 7、8、9、10、11
> SADD uid:2 7 8 9 10 11
(integer) 5

# 获取共同关注
> SINTER uid:1 uid:2
1) "7"
2) "8"
3) "9"

# 给 uid:2 推荐 uid:1 关注的公众号:在uid:1中有但是uid:2中没有的
> SDIFF uid:1 uid:2
1) "5"
2) "6"

# 验证某个公众号是否同时被 uid:1 或 uid:2 关注:
> SISMEMBER uid:1 5
(integer) 1 # 返回0,说明关注了
> SISMEMBER uid:2 5
(integer) 0 # 返回0,说明没关注

抽奖活动

存储某活动中中奖的用户名 ,Set 类型因为有去重功能,可以保证同一个用户不会中奖两次。

shell

# key为抽奖活动名,value为员工名称,把所有员工名称放入抽奖箱 :
>SADD lucky Tom Jerry John Sean Marry Lindy Sary Mark
(integer) 5

# 如果允许重复中奖,可以使用 SRANDMEMBER 命令。
# 抽取 1 个一等奖:
> SRANDMEMBER lucky 1
1) "Tom"
# 抽取 2 个二等奖:
> SRANDMEMBER lucky 2
1) "Mark"
2) "Jerry"
# 抽取 3 个三等奖:
> SRANDMEMBER lucky 3
1) "Sary"
2) "Tom"
3) "Jerry"

# 如果不允许重复中奖,可以使用 SPOP 命令。
# 抽取一等奖1个
> SPOP lucky 1
1) "Sary"
# 抽取二等奖2个
> SPOP lucky 2
1) "Jerry"
2) "Mark"
# 抽取三等奖3个
> SPOP lucky 3
1) "John"
2) "Sean"
3) "Lindy"

Zset 类型

排序场景,比如排行榜、电话和姓名排序等。

常用命令

  • 存储值:zadd key [NX|XX] [CH] [INCR] score member [score member ...]
  • 获取元素分数:zscore key member
  • 获取排名范围:zrange key start stop [WITHSCORES]
  • 获取指定分数范围排名:zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
  • 增加指定元素分数:zincrby key increment member
  • 获取集合元素个数:zcard key
  • 获取指定范围分数个数:zcount key min max
  • 删除指定元素:zrem key member [member ...]
  • 获取元素排名:zrank key member

Zset结构

highlighter- Java

typedef struct zset {
    dict *dict;//哈希表
    zskiplist *zsl;//跳表
} zset;

zset 结构体里有两个数据结构:一个是跳表,一个是哈希表。这样的好处是既能进行高效的范围查询(如 ZRANGEBYSCORE 操作,利用了跳表),也能进行高效单点查询(如 ZSCORE 操作,利用了hash表)。

排行榜

五篇博文,分别获得赞为 200、40、100、50、150。

highlighter- Bash

# arcticle:1 文章获得了200个赞
> ZADD user:seven:ranking 200 arcticle:1
(integer) 1
# arcticle:2 文章获得了40个赞
> ZADD user:seven:ranking 40 arcticle:2
(integer) 1
# arcticle:3 文章获得了100个赞
> ZADD user:seven:ranking 100 arcticle:3
(integer) 1
# arcticle:4 文章获得了50个赞
> ZADD user:seven:ranking 50 arcticle:4
(integer) 1
# arcticle:5 文章获得了150个赞
> ZADD user:seven:ranking 150 arcticle:5
(integer) 1

# 获取文章赞数最多的 3 篇文章, ZREVRANGE 命令(倒序获取有序集合 key 从start下标到stop下标的元素)
# WITHSCORES 表示把 score 也显示出来
> ZREVRANGE user:seven:ranking 0 2 WITHSCORES
1) "arcticle:1"
2) "200"
3) "arcticle:5"
4) "150"
5) "arcticle:3"
6) "100"

# 获取 100 赞到 200 赞的文章,ZRANGEBYSCORE 命令(返回有序集合中指定分数区间内的成员,分数由低到高排序)
> ZRANGEBYSCORE user:xiaolin:ranking 100 200 WITHSCORES
1) "arcticle:3"
2) "100"
3) "arcticle:5"
4) "150"
5) "arcticle:1"
6) "200"

电话,姓名排序

电话排序

highlighter- Bash

# 将电话号码存储到 SortSet 中,然后根据需要来获取号段:
> ZADD phone 0 13100111100 0 13110114300 0 13132110901 
(integer) 3
> ZADD phone 0 13200111100 0 13210414300 0 13252110901 
(integer) 3
> ZADD phone 0 13300111100 0 13310414300 0 13352110901 
(integer) 3

# 获取所有号码
> ZRANGEBYLEX phone - +
1) "13100111100"
2) "13110114300"
3) "13132110901"
4) "13200111100"
5) "13210414300"
6) "13252110901"
7) "13300111100"
8) "13310414300"
9) "13352110901"

# 获取 132 号段的号码:
> ZRANGEBYLEX phone [132 (133
1) "13200111100"
2) "13210414300"
3) "13252110901"

# 获取132、133号段的号码:
> ZRANGEBYLEX phone [132 (134
1) "13200111100"
2) "13210414300"
3) "13252110901"
4) "13300111100"
5) "13310414300"
6) "13352110901"
姓名排序

highlighter- Bash

> zadd names 0 Toumas 0 Jake 0 Bluetuo 0 Gaodeng 0 Aimini 0 Aidehua 
(integer) 6

# 获取所有人的名字:
> ZRANGEBYLEX names - +
1) "Aidehua"
2) "Aimini"
3) "Bluetuo"
4) "Gaodeng"
5) "Jake"
6) "Toumas"

# 获取名字中大写字母A开头的所有人:
> ZRANGEBYLEX names [A (B
1) "Aidehua"
2) "Aimini"

# 获取名字中大写字母 C 到 Z 的所有人:
> ZRANGEBYLEX names [C [Z
1) "Gaodeng"
2) "Jake"
3) "Toumas"

BitMap(2.2 版新增):

介绍

适用于二值状态统计的场景。

签到

只记录签到(1)或未签到(0)

highlighter- Markdown

# 记录用户 4 月 3 号已签到
SETBIT uid:sign:100:202304 2 1

# 检查该用户 6 月 3 日是否签到
> GETBIT uid:sign:100:202306 3
1

# 统计用户在 6 月份的签到次数
> BITCOUNT uid:sign:100:202206
1

# 统计这个月首次打卡时间;BITPOS key bitValue [start] [end],start end 表示要检测的范围
BITPOS uid:sign:100:202206 1

判断用户登陆状态

key = login_status 表示存储用户登陆状态集合数据, 将用户 ID 作为 offset,在线就设置为 1,下线设置 0。通过 GETBIT判断对应的用户是否在线。 5000 万用户只需要 6 MB 的空间。

highlighter- Bash

# 表示ID = 10086 的用户已登陆
SETBIT login_status 10086 1

# 检查该用户是否登陆,返回值 1 表示已登录
GETBIT login_status 10086

# 登出,将 offset 对应的 value 设置成 0。
SETBIT login_status 10086 0

连续签到用户总数

把每天的日期作为 Bitmap 的 key,userId 作为 offset,若是打卡则将 offset 位置的 bit 设置成 1。key 对应的集合的每个 bit 位的数据则是一个用户在该日期的打卡记录。

那就可以设置 7 个 Bitmap,对这 7 个 Bitmap 的对应的 bit 位做 『与』运算。那么当一个 userID 在 7 个 Bitmap 对应对应的 offset 位置的 bit = 1 就说明该用户 7 天连续打卡。结果保存到一个新 Bitmap 中,我们再通过 BITCOUNT 统计 bit = 1 的个数便得到了连续打卡 7 天的用户总数了。

HyperLogLog(2.8 版新增)

海量数据基数统计的场景,提供不精确的去重计数。但要注意,HyperLogLog 的统计规则是基于概率完成的,不是非常准确,标准误算率是 0.81%。因此适用于海量数据的场景。

HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的内存空间总是固定的、并且是很小的。在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数,和元素越多就越耗费内存的 Set 和 Hash 类型相比,HyperLogLog 就非常节省空间。

百万级网页 UV 计数

在统计 UV 时,可以用 PFADD 命令(用于向 HyperLogLog 中添加新元素)把访问页面的每个用户都添加到 HyperLogLog 中。

highlighter- Markdown

PFADD page1:uv user1 user2 user3 user4 user5

# 可以用 PFCOUNT 命令直接获得 page1 的 UV 值,获取统计结果
PFCOUNT page1:uv

GEO(3.2 版新增)

存储地理位置信息的场景

Redis GEO 操作方法有:

  • geoadd:添加地理位置的坐标。
  • geopos:获取地理位置的坐标。
  • geodist:计算两个位置之间的距离。
  • georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
  • georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
  • georadius:以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。

GEORADIUS方法参数:

highlighter- SQL

GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

参数说明:

  • m :米,默认单位。
  • km :千米。
  • mi :英里。
  • ft :英尺。
  • WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。
  • WITHCOORD: 将位置元素的经度和维度也一并返回。
  • WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。这个选项主要用于底层应用或者调试, 实际中的作用并不大。
  • COUNT 限定返回的记录数。
  • ASC: 查找结果根据距离从近到远排序。
  • DESC: 查找结果根据从远到近排序。

滴滴叫车

假设车辆 ID 是 33,经纬度位置是(116.034579,39.030452),可以用一个 GEO 集合保存所有车辆的经纬度,集合 key 是 cars:locations。

highlighter-

GEOADD cars:locations 116.034579 39.030452 33

当用户想要寻找自己附近的网约车时,LBS 应用就可以使用 GEORADIUS 命令。
例如,LBS 应用执行下面的命令时,Redis 会根据输入的用户的经纬度信息(116.054579,39.030452 ),查找以这个经纬度为中心的 5 公里内的车辆信息,并返回给 LBS 应用。

highlighter- SQL

GEORADIUS cars:locations 116.054579 39.030452 5 km ASC COUNT 10

附近的人

nearbyPeople 是一个总的 key,user_1 和 user_2 是相当于 nearbyPeople 里面的两个元素以及他们对应的经纬度,这个例子就是把 user_1 和 user_2 的经纬度存在了 nearbyPeople 这个 key 中

highlighter- Bash

redis> GEOADD nearbyPeople 13.36 38.11 "user_1" 15.08 37.50 "user_2"  
(integer) 2

获取 nearbyPeople 中的元素 user_1 和 user_2 这两个元素的经纬度,当然如果之前没有 geoadd 相对应元素的经纬度的话,会返回 nil

highlighter- Java

redis> GEOPOS nearbyPeople user_1 user_21) 1) "13.36138933897018433"   2) "38.11555639549629859"2) 1) "15.08726745843887329"   2) "37.50266842333162032"

获取 nearbyPeople 中 user_1 和 user_2 这两个节点之间的距离,距离单位可以指定,如下所示:

  • m :米,默认单位。
  • km :千米。
  • mi :英里。
  • ft :英尺。

highlighter- Java

redis> GEODIST nearbyPeople user_1 user_2"166274.1516"redis> GEODIST nearbyPeople user_1 user_2 km"166.2742"redis> GEODIST nearbyPeople user_1 user_2 mi"103.3182"

把 nearbyPeople 中的 距离经纬度(15,37)200km 以内的元素都找出来,而且带上距离:

highlighter- Java

redis>GEORADIUS nearbyPeople 15 37 200 km WITHDIST  
1) 1) "user_1"  
   2) "190.4424"  
2) 1) "user_2"  
   2) "56.4413"

Stream(5.0 版新增)

消息队列,解决了基于 List 类型实现的消息队列中存在的两个问题。
可以自动生成全局唯一消息ID,并支持以消费组形式消费数据。

Google Earth Engine:计算逐年全球潜在蒸发量(PET)的 ERA 数据 通过获取温度、湿度和降水数据,并使用Penman-Monteith公式,我们可以得到每年的潜在蒸发量。在本文中,我们将使用Google Earth Engine平台和ERA(欧洲再分析气象数据集)数据来计算逐年全球的潜在蒸发量(PET)。接下来,我们需要对ERA数据进行预处理,以获取我们需要的潜在蒸发量数据。有了温度、湿度和降水数据,我们可以使用Penman-Monteith公式来计算每年的潜在蒸发量。最后,我们可以将计算得到的潜在蒸发量数据进行可视化,以便更好地理解全球的水汽蒸发情况。 阅读详情

相关推荐

用Logisim搞定华科计组实验:单总线CPU设计从微程序到硬布线的保姆级通关攻略

本文详细介绍了如何使用Logisim完成华中科技大学计算机组成原理实验中的单总线CPU设计,涵盖从微程序控制器到硬布线控制器的完整实现过程。通过MIPS指令译码器设计、微程序控制原理、状态机实现等关键步骤的保姆级教程,帮助学生掌握CPU设计的核心技能,并提供Educoder平台提交与调试的实用技巧。

weixin_30897233的博客 476

Redission之GeoHash

由于最近项目中需要用到距离计算, 附近位置等功能, 就想到redis了的GeoHash, 关于GeoHash的概念就不过多介绍, 用法也比较简单, 但由于项目中使用的是Redission, 网上有关Redission 使用GeoHash的工具类也非常之少, 无奈只能自己动手写了。 话不多说,直接上工具类, 做了两层封装。 一.RedissonTemplate /** * 操作对象 */ public class RedissonTemplate { @Resource priva

wit_cx的博客 1035

关于海康网络摄像头使用VLC或者Opencv拉流有延迟的问题

先说结论,我用VLC或者Pyhton opencv直接拉取海康网络摄像头的rtsp流,会有1-2s延时,特别明显。环境:Windows + VLC / Openc-Python。如上面文章介绍,我使用的时候遇到一处错误,需要把代码中的。海康SDK:与网页视频相比,几乎是同步的。上面说的延时,也是与摄像头网页视频相比的。ffplay 去掉缓存:延时1s左右。这两处地方改成左斜杠,才能运行。opencv拉流使用的是。多线程:延时1s左右。

yljxh的博客 4500

Redisson—分布式对象

Redisson—分布式对象

深圳市多克创新科技有限公司 1893

30分钟搭建AI科研写作工作台:基于WorkBuddy的论文全流程加速实践

在人工智能技术日益普及的今天,如何利用智能工具提升专业领域工作效率成为关键课题。其核心原理在于通过模块化设计,将复杂的任务流程拆解为可复用、可编排的标准化技能单元,并结合精准的指令控制,实现从通用对话到深度任务执行的转变。这一技术价值在于显著降低重复性劳动强度,将人的创造力聚焦于核心决策与创新环节。在科研写作、数据分析、代码开发等场景中,这类智能工作台能有效辅助完成文献调研、内容生成、格式校验等繁琐步骤。本文以科研论文写作为具体应用场景,深入探讨如何利用WorkBuddy这一智能工作台,通过配置核心科研技能

weixin_29032489的博客 1501

EEGLAB+ERPLAB实战:从.cnt文件到情绪ERP差异波,一份避坑指南

本文详细介绍了使用EEGLAB和ERPLAB处理Neuroscan的.cnt格式脑电数据的全流程,从数据导入、预处理到情绪ERP差异波生成。重点解决了采样率验证、事件标记检查、重参考选择、滤波策略与ICA组合等实操难题,并提供了情绪图片ERP研究中P1、EPN和LPP成分的分析技巧,帮助研究者避免常见错误,提升数据处理效率。

weixin_26795617的博客 264

redission分布式对象

公共讲解 RedissonClient(同步异步)、RedissonReactiveClient(反射式Reactive )和RedissonRxClient(RxJava2)实例本身和Redisson提供的所有分布式对象都是线程安全的 1.首先先进行一步简单的配置redis的步骤 Config config = new Config(); SingleServerConfig singleServerConfig = config.useSingleServer() .setA

weixin_43410352的博客 1660

离合器KP点自学习:从原理到工程实践的全景解析

本文全面解析了离合器KP点自学习的原理与工程实践,详细介绍了KP点的物理本质、控制价值及自学习方法。通过扭矩增量式和转速变化式学习法,结合不同变速箱构型的适配策略,提升离合器控制的精度与效率。文章还探讨了液压系统迟滞补偿和摩擦材料老化应对方案,为工程实践提供可靠保障。

weixin_33717117的博客 287

Redisson分布式地理空间:基于Redis的位置查询

在现代应用开发中,位置服务已成为核心需求之一。无论是外卖配送、共享单车还是社交应用的附近功能,都依赖高效的地理空间数据处理能力。Redisson作为Redis的Java客户端,提供了强大的分布式地理空间(Geospatial)功能,本文将详细介绍如何使用Redisson实现基于Redis的位置查询。 ## 核心功能与实现 Redisson的地理空间功能主要通过`RedissonGeo`类实现,...

gitblog_00871的博客 832

14、5G物理层的灵活解决方案:广义频分复用(GFDM)

广义频分复用(GFDM)作为一种高度灵活的5G物理层多载波调制方案,能够满足多样化应用场景的需求,包括高吞吐量的比特管道通信、低功耗高连接数的物联网、超低延迟的触觉互联网以及广覆盖的无线区域网。通过参数化配置,GFDM可适配LTE资源网格,实现与现有系统的兼容与共存。其支持多种解调方式、干扰消除技术、OQAM映射及预编码机制,兼具低带外发射、高频谱效率和强鲁棒性。GFDM还能统一描述OFDM、FBMC、FTN等多种经典与先进波形,成为5G及未来通信系统中极具潜力的通用波形框架。

gold8的专栏 108

Exploring Automated Distractor Generation for Math Multiple-choice Questions via Large Language Mode

多项选择题(MCQ)在几乎所有级别的教育中都无处不在,因为它们易于管理、评分,并且是评估和实践中可靠的格式。MCQ最重要的方面之一是干扰因素,即旨在针对真实学生常见错误或误解的不正确选项。迄今为止,对于教师和学习内容设计师来说,制作高质量的干扰物的任务在很大程度上仍然是一个劳动和时间密集型的过程,其可扩展性有限。在这项工作中,我们研究了数学MCQ领域的自动干扰物生成任务,并探索了从上下文学习到微调的各种基于大型语言模型(LLM)的方法。

c_cpp_csharp的专栏 317

Redis常见数据类型和应用场景

String是最基本的key-value结构,key是唯一标识,value是具体的值,value不仅可以是字符串,也可以是数字(整数或者浮点数),value容纳的数据上限为512M。List是简单的字符串列表,按照插入顺序排序,可以从首、尾操作列表中的元素。Set是Redis中的单列集合,满足下列特点:无序元素唯一可进行交集、并集、差集操作list类型和set类型的区别:list可存储重复元素,set只能存储唯一元素。存储元素时list有序,set无序。

Cesar_x的博客 4528

C#与倍福TwinCAT3通信实战:ADS协议封装与设备变量读写完整源码

倍福(Beckhoff)TwinCAT3 作为工业自动化领域主流的软PLC系统,其内置的ADS(Automation Device Specification)协议是实现上位机与TwinCAT3通信的核心标准。传统ADS通信开发存在门槛高(协议细节复杂)、稳定性差(缺乏统一异常处理)、复用性低(重复编码)等问题。本文基于 C# 技术栈,聚焦“协议封装标准化、变量读写易用化、通信稳定工业化”核心需求,提供一套完整的 ADS 协议封装方案与设备变量读写源码。

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

Redis中常见的数据类型及其应用场景

适用于二值状态统计的场景。

sdgfafg_25的博客 1532

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

redis五种数据类型及其常见操作

redis五种数据类型及其常见操作 Redis支持5种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。 1、string string是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。value其实不仅是String,也可以是数字。str...

zhangsq1319 4096

NTscan扫描工具

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

【Redis原理】Redis基本数据类型及其原理

Redis支持多种数据类型,各有特点及应用场景:String(字符串)可存储文本、数字或二进制数据,适用于缓存、计数和简易分布式锁;List(列表)按插入顺序存储元素,适合最新动态展示和简单消息队列;Hash(哈希表)存储键值对,用于对象数据存储;Set(集合)存储唯一元素,支持集合运算,适用UV统计和好友推荐;Zset(有序集合)按分值排序,适合排行榜和优先级队列;BitMap(位图)通过二进制位节省空间,适用于签到统计和用户在线状态。

gadiaola的博客 2201

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Redis常见的数据类型和应用场景

Redis(Remote Dictionary Server)是一个开源的高性能键值数据库,以其内存中数据存储、支持数据持久化、丰富的数据结构和原子操作而闻名。它通常用作数据库、缓存和消息队列系统。String类型是Redis中最基础的数据结构,它提供了简单的key-value存储功能。其中,key是数据的唯一标识符,而value可以是字符串或者数字。List类型在Redis中是一个双向链表结构,它可以存储一系列的字符串元素,元素在链表中有序,并且可以支持从链表的头部或尾部插入或删除元素。

z3551906947的博客 2045

Redis常用数据类型及其应用场景

Bitmap 存储的是连续的二进制数字(0 和 1),通过 bitmap, 只需要一个 bit 位来表示某个元素对应的值或者状态,key 就是对应元素本身。有序集合(Sorted Set):存储唯一、有序的元素集合,每个元素都关联一个分数,用于根据分数排序。存储键值对的无序集合,适合存储对象的属性。可以对集合进行添加、删除、查找、交集、并集等操作。字符串(String):可以存储任意类型的数据,比如字符串、整数、浮点数等。

1+1=王的博客 2908

Redis的数据类型以及应用场景

Redis 有序集合(Sorted Set)是一种带有分数的集合,集合中的每个成员都有一个分数,Redis 会按照分数的大小进行排序。以下是 Redis 有序集合的一些常见应用场景及其示例代码。Redis 集合(Set)是一种无序的字符串集合,集合中的元素是唯一的,不允许重复。HyperLogLog 是 Redis 中的一种用于基数(唯一值)统计的数据结构,能够在极小的内存占用下提供高精度的基数估计。位图(Bitmap)在 Redis 中是一种高效的按位存储数据的方式,主要用于处理需要进行按位操作的场景。

ArchManual 分布式技术架构手册 2450

Redis的主要数据类型及其应用场景

Redis 是一种高性能的键值存储系统,支持多种数据类型,每种类型针对不同的应用场景设计。通过合理选择数据类型,可以充分发挥 Redis 的高性能特性,满足多样化的业务需求。

ttyy1112的专栏 913

【Redis】数据类型详解及其应用场景

目录Redis 常⻅数据类型预备知识基本全局命令小结数据结构和内部编码单线程架构引出单线程模型为什么单线程还能这么快 Redis 常⻅数据类型 Redis 提供了 5 种数据结构,理解每种数据结构的特点对于 Redis 开发运维⾮常重要,同时掌握每种数据结构的常⻅命令,会在使⽤ Redis 的时候做到游刃有余。本章内容如下: 预备知识:⼏个全局(generic)命令,数据结构和内部编码,单线程模式机制分析。 5 种数据结构的特点、命令使⽤、应⽤场景⽰例。 键遍历、数据库管理。 预备知识 在正式介绍 5

Hsusan的博客 1640

✅Redis 常见数据类型和应用场景(详解)

Redis 常见数据类型和应用场景(详解)

weixin_62079735的博客 1283

Redis:常用数据类型及其应用场景

String类型的应用场景: 常规计数:因为 Redis 处理命令是单线程,所以执行命令的过程是原子的。因此 String 数据类型适合计数场景,比如计算访问次数、点赞、转发、库存数量等等。分布式锁:SET 命令有个 NX 参数可以实现key不存在才插入,可以用它来实现分布式锁: 如果 key 不存在,则显示插入成功,可以用来表示加锁成功;如果 key 存在,则会显示插入失败,可以用来表示加锁失败。

qq_64680177的博客 1562

Redis 的应用场景

Redis 提供了丰富的数据类型,每种类型都有其独特的应用场景。在实际开发中,选择合适的数据结构可以大大提高系统的性能和效率。掌握 Redis 的这些常见数据类型及其应用场景,将帮助你设计出更加高效的系统。

小小程序猿 2398

Redis常见数据类型及应用场景

数据结构特性典型应用场景String简单键值,支持数字和位操作缓存、计数器、分布式锁Hash适合存储对象,可部分更新用户信息、购物车、配置项List有序、可重复,支持阻塞操作消息队列、最新列表、历史记录Set无序、唯一,支持集合运算标签、共同好友、抽奖、黑白名单Sorted Set唯一、有序(按分数排序)排行榜、优先级队列、范围查找Bitmaps极省空间的布尔状态存储用户签到、活跃用户统计极省空间的基数估算网站UV统计Streams持久化的消息流复杂消息队列选择时考虑以下几点数据形态。

王富贵的博客 933
上一篇: 一文带你了解什么是servlet!
下一篇: 【Redis】万字长文带你深入Redis底层数据结构!
加班不秃顶
博客等级 码龄7年 1822粉丝 599原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值