Redis指南【2】五大基本类型

基于YOLOv8的城市违建识别系统:从数据集构建到UI界面实现 YOLOv8是Ultralytics公司于2023年推出的最新一代YOLO(You Only Look Once)系列目标检测算法。更高效的骨干网络设计改进的锚框机制更精确的损失函数支持分类、检测、分割等多任务YOLOv8特别适合像违建识别这样的实时检测任务,能够在保持高精度的同时实现快速推理。 阅读详情

一、前言

了解了NoSQL的发展历史,我们接下来开始揭开redis的序幕。

Redis以高超的性能,完美的文档、简洁易懂的原码和丰富的客户端库支持在开源中间件领域广受好评。

深入了解Redis的应用和实践,成为如今中高级后端开发的必备技能。

二、入门概述

2.1 它是什么?

Redis 全称 Remote Dictionary Server,中文名为远程字典服务器。redis被好多人形象的比喻成一把瑞士军刀,因为它的功能非常丰富。

查看官网介绍:

Redis 是一种开源(BSD 许可)、内存中数据结构存储,用作数据库、缓存和消息代理。Redis 提供数据结构,例如字符串、散列、列表、集合、带有范围查询的排序集合、位图、超级日志、地理空间索引和流。Redis 内置复制、Lua 脚本、LRU 驱逐、事务和不同级别的磁盘持久化,并通过 Redis Sentinel 和 Redis Cluster 自动分区提供高可用性。

嗯嗯,看完这个,我们知道既它可以是一个数据库,也可以是缓存和消息代理中间件。它也是我们前面说的NoSQL中的键值存储数据库。

2.2 起源

2008年,意大利一家创业公司Merzia的创始人Salvatore Sanfilippo 发现了MYSQL存在的低性能问题,就决定亲自实现一个数据库,并在2009年开发完成了Redis的最初版本。短短几年后,redis便拥有了一大批的用户群体。

Redis之父网名Antirez 于2020年6月发表退役声明,短短十年左右的时间,说Redis 加速了互联网的进程也不为过,而redis的默认端口 6379 也不是随机选的,由手机键盘的 “MERZ” 的位置来决定,缘于意大利广告女郎在节目上说了一堆愚蠢的话而被他不爽,把她名字做为端口号,称为愚蠢的代名词。

2.3 redis能做什么

redis 具有以下性能:

  • 1、速度快,性能高 :基于内存操作
  • 2、丰富的数据结构: string、list、hash、set、sortedset等不同类型
  • 3、多语言支持
  • 4、持久化:支持数据的持久化,可以把内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • 5、高可用和分布式:主从复制等技术

基于这些特点,redis可以做什么?

1、缓存系统

缓存热点内容,减少数据库压力。

2、计数器

记录贴子的点赞数、评论数和点击数。

3、消息队列

对消息可靠性要求不高的时候,可以基于redis来实现消息队列。

5、分布式锁

常见于高并发环境,通过setnx设置lock在分布式环境下可以使用,也可以加上加锁时间。

当然,实际中可能用不到这么多需求,但是学一门技术的目的就是解决问题,所以,我们需要学习更多的redis高级特性,这样在做一些看似很难完成的任务到时候,说不定redis就可以派上用场。

2.4 redis安装

三、五大基本类型

这部分内容是 redis 的重中之重,也是入门 redis 的最基础的内容。

reids的命令比较多,下面开始回顾。

3.1 reids-key 基础命令


127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> get name
"xulei"
127.0.0.1:6379> expire name 3
(integer) 1
127.0.0.1:6379> ttl name # 剩余时间
(integer) -2
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> exists name
(integer) 0
127.0.0.1:6379> type age
string

3.2 string
3.2.1 内部结构

string 是 redis 中 最简单的数据结构,它的内部是一个字符数组。Redis 中所有的数据结构都通过 唯一的key 来获取相应的 value ,而数据类型value 就是区分 这五大基本类型的地方。

string 也是我们最常用的数据结构,如图,我们常见的用途就是存储用户信息,将JSON序列化成String存储,取出时在反序列化。

​

redis 中的String 的字符串是动态字符串,并非我们传统的字符串数组,即它可以发生动态变换,内部结构类似于Java 的 ArrayList ,在创建初始的时候就会分配一个预分配内存,从而减少内存的频繁分配,这种字符串简称SDS(simple dynamic stirng)。

其内部定义如下:



struct sdshdr {
	// 记录buf数组中已使用字节的数量
	// 等于sds 所保存字符串的长度
	int len;
	// 等于sds所保存字符串的长度
	int free;
	// 字节数组,用于保存字符串
	char buf[];
}

​

该图展示了一个SDS 实例

  • free 属性的值为0,表示这个SDS 没有剩余空间分配
  • len 表示SDS 保存了一个五字节长的字符串
  • buf 属性是一个char 类型的数组,最后一个字节则保存了空字符 ’ \0‘
3.2.2 空间预分配法则和惰性空间释放策略

这两种策略的目的是对未使用空间的一个利用,也就是前面讲的free属性值。

1、空间预分配:

空间预分配用于优化SDS的字符串增长操作,当SDS 的API 对一个SDS 进行修改,并且对SDS进行空间扩展的时候,程序会动态修改已分配空间值和未分配空间值。 类似Java 的ArrayList的扩容。

公式如下:

  • 1、赋值时,当len的长度小于1MB,那么len 属性等于实际的字符串长度,free 的属性值=len值,也就是扩容都是加倍的
  • 2、赋值时,当len 的长度大于等于1MB,那么程序会分配1MB固定的未使用空间。
  • 3、注意:字符串的最大值为512MB

2、惰性空间释放:

惰性空间释放用于优化SDS 的字符串缩短操作,即当字符串个数变少的时候,并不会立即回收多余的空间,而是把空间放在free中。这种避免了缩短字符串所需的内存重分配操作。

当然,SDS也提供相应的API,真正箱释放的时候,也会把这些多余的free释放掉,防止空间占用内存。

3.2.3 常用操作

键值对:



127.0.0.1:6379> set key1 v1
OK
127.0.0.1:6379> keys *
1) "key1"
2) "age"
127.0.0.1:6379> APPEND key1 hello
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> strlen key1
(integer) 7

加减操作, 可以设置步长



127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> decr views
(integer) 1
127.0.0.1:6379> incrby views 10
(integer) 11
127.0.0.1:6379> decrby views 2
(integer) 9

字符串范围:



127.0.0.1:6379> set key1 "hello,xulei"
OK
127.0.0.1:6379> getrange key1 0 4
"hello"
127.0.0.1:6379> getrange key1 0 -1 # 获取所有的字符串
"hello,xulei"

替换:



127.0.0.1:6379> set key2 abcd
OK
127.0.0.1:6379> get key2
"abcd"
127.0.0.1:6379> setrange key2 1 xx
(integer) 4
127.0.0.1:6379> get key2
"axxd"

setex 和setnx:



#setex(set with expire) 设置过期时间
#setnx(set if not exist) 不存在设置

127.0.0.1:6379> setex key3 20 hualin
OK
127.0.0.1:6379> get key3
"hualin"
127.0.0.1:6379> ttl key3
(integer) 5
127.0.0.1:6379> setnx mykey redis # 如果mykey不存在,创建成功
(integer) 1
127.0.0.1:6379> keys *
1) "key1"
2) "mykey"
3) "key2"
127.0.0.1:6379> ttl key3
(integer) -2
127.0.0.1:6379> setnx mykey 1 # 如果mykey存在,创建失败
(integer) 0
127.0.0.1:6379> get mykey
"redis"

批量获取和设置:



# mset 
# mget
# msetnx 是一个原子性的操作,要么一起成功,要么一起失败

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379> get k3
"v3"
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"

127.0.0.1:6379> msetnx k1 v1 k4 v4
(integer) 0
127.0.0.1:6379> get k4
(nil)

对象:



set user:1 {name:zhangson,age:29}
# 设置一个user:1对象,值为json字符来保存一个对象
127.0.0.1:6379> mset user:2:name xulei user:2:age 26 
OK

########## 
# getset 先get然后set,更新的操作,并返回value
127.0.0.1:6379> getset db redis
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb
"redis"
127.0.0.1:6379> get db
"mongodb"

3.3 List

redis 的list 实际上是一个链表结构,是双向链表,对应Java 语言中的 linkedList , 这种结构带有表头节点指针、表尾节点指针,以及链表长度等信息。因此,它也具有链表的特点,即查询慢, 增删快。

​

Redis 的列表结构常用来做异步队列使用,一边读取入队,另一边出队。

常用命令:

  • lpush/rpush .... 从左边/右边插入一个或多个值。
  • lpop/rpop 从左边/右边吐出一个值。
  • rpoplpush 从列表右边吐出一个值,插到列表左边
  • lrange
  • lrange mylist 0 -1 0左边第一个,-1右边第一个,(0-1表示获取所有)
  • lindex 按照索引下标获得元素(从左到右)
  • llen 获得列表长度
  • linsert before 在的后面插入插入值
  • lrem 从左边删除n个value(从左到右)
  • lset将列表key下标为index的值替换成value

常见应用:

127.0.0.1:6379> lpush list one
(integer) 1
127.0.0.1:6379> lpush list tow
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "tow"
3) "one"
127.0.0.1:6379> lrange list 0 2
1) "three"
2) "tow"
3) "one"
127.0.0.1:6379> lrange list 0 1 #通过区间获取 从尾部依次往前获取
1) "three"
2) "tow"
127.0.0.1:6379> lrange list 1 2 
1) "tow"
2) "one"

127.0.0.1:6379> rpush list zero
(integer) 4
127.0.0.1:6379> lrange list 0 -1 # 插入到头部
1) "three"
2) "tow"
3) "one"
4) "zero"

############# 

127.0.0.1:6379> lpop list # 移除尾部元素
"three"
127.0.0.1:6379> rpop list # 移除头部元素
"zero"
127.0.0.1:6379> lrange list 0 -1
1) "tow"
2) "one"


###################

# 通过下标获取某个值 lindex
127.0.0.1:6379> lrange list 0 -1
1) "tow"
2) "one"
127.0.0.1:6379> Lindex list 1
"one"
127.0.0.1:6379> Lindex list 0
"tow"
127.0.0.1:6379> Lindex list 2
(nil)

#######################
Llen: 返回列表的长度
127.0.0.1:6379> llen list 
(integer) 3

#####################
# lrem 移除指定的值,移除是从头部开始移除的
取关:uid
127.0.0.1:6379> lrem list 1 1
(integer) 1

127.0.0.1:6379> lrange list 0 -2
1) "2"
2) "2"
3) "1"
4) "2"
5) "2"
6) "3"
127.0.0.1:6379> lrem list 2 2
(integer) 2
127.0.0.1:6379> lrange list 0 -2
1) "1"
2) "2"
3) "2"
4) "3"

###############################
# ltrim 截取list的元素,只剩下剪短后的元素,
# ltrim 1 0 # 是清空整个列表的意思,因为区间长度为负

127.0.0.1:6379> lrange list2 0 -1
1) "hello5"
2) "hello4"
3) "hello3"
4) "hello2"
5) "hello"
127.0.0.1:6379> ltrim list2 2 3
OK
127.0.0.1:6379> lrange list2 0 -1
1) "hello3"
2) "hello2"
127.0.0.1:6379> 

#################
rpoplpush # 移除列表的最后一个元素

127.0.0.1:6379> rpush mylist hello1
(integer) 1
127.0.0.1:6379> rpush mylist hello2
(integer) 2
127.0.0.1:6379> rpush mylist hello3
(integer) 3
127.0.0.1:6379> rpush mylist hello4
(integer) 4
127.0.0.1:6379> rpush mylist hello5
(integer) 5
127.0.0.1:6379> rpoplpush mylist othorlist
"hello5"
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello2"
3) "hello3"
4) "hello4"
127.0.0.1:6379> lrange othorlist 0 -1
1) "hello5"

#################
# lset 将列表中指定的下标的值替换为另外一个值 更新操作

127.0.0.1:6379> lset list 0 item # 判断这个列表是否存在,
(error) ERR no such key
127.0.0.1:6379> lpush list value1
(integer) 1
127.0.0.1:6379> lset list 0 item
OK
127.0.0.1:6379> lrange list 0 0
1) "item"

####################
# linsert 在before和after插入 具体的值

127.0.0.1:6379> lrange list 0 -1
1) "intem3"
2) "intem2"
3) "item"
127.0.0.1:6379> linsert list before "item" nimabi 
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "intem3"
2) "intem2"
3) "nimabi"
4) "item"
127.0.0.1:6379> linsert list after item hahahhahah
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "intem3"
2) "intem2"
3) "nimabi"
4) "item"
5) "hahahhahah"

3.4 set(集合)

redis 的 set 集合相当于 Java 语言里面的 HashSet ,它的内部的键值对是无序的、唯一的。它的内部实现相当于一个特殊的字典,字典中所有的value 都是一个值 NULL ,当集合中最后一个元素被移除之后,数据结构被自动删除,内存被回收。

set 中的值是不允许重复的,无序的。可以用来存储在某个活动中 中奖的用户ID,可以去重作用,保证一个用户不会中奖两次。

常用命令:

  • sadd key value1 value2 :将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略。
  • smembers key :取出该集合的所有值。
  • sismember key value :判断集合key是否含有该value值,有1,无返回0
  • scard key value :返回该集合的元素个数
  • srem key value :删除集合中的某个元素
  • spop key :随机从该集合中吐出一个值
  • srandmember key n :随机中该集合中取出n个值,不会从集合中删除
  • smove source destination value :把集合中的一个值从一个集合移动到另一个集合
  • sinter key1 key2 :返回两个集合的交集元素
  • sunion key1 key2 :返回两个集合的并集元素
  • sdiff key1 key2 :返回两个集合的差集元素(key1 中的,不包含key2中的)

命令应用:



##################################
# sadd 添加元素
# smembers :所有的set集合
# sismember :判断是否有该元素
# scard :获取当前的元素

127.0.0.1:6379> sadd myset hello
(integer) 1
127.0.0.1:6379> sadd myset xiaolei
(integer) 1
127.0.0.1:6379> sadd myset xulei love hualin
(integer) 3
127.0.0.1:6379> smembers myset
1) "xulei"
2) "hello"
3) "love"
4) "xiaolei"
5) "hualin"
127.0.0.1:6379> sismember myset hello
(integer) 1
127.0.0.1:6379> scard myset
(integer) 5
########################################
# srem : 移除set集合元素
# SRANDMEMBER:随机抽选出一个元素

127.0.0.1:6379> srem myset hello
(integer) 1
127.0.0.1:6379> SRANDMEMBER myset 
"xulei"
127.0.0.1:6379> SRANDMEMBER myset 
"hualin"
127.0.0.1:6379> SRANDMEMBER myset 
"love"

########################################
# spop :随机删除key

127.0.0.1:6379> spop myset
"hualin"
127.0.0.1:6379> SMEMBERS myset
1) "love"
2) "xulei"
3) "xiaolei"
127.0.0.1:6379> spop myset
"love"

########################################
# 将一个指定的值,移动到另外一个集合中

127.0.0.1:6379> sadd myset hello
(integer) 1
127.0.0.1:6379> sadd myset world
(integer) 1
127.0.0.1:6379> sadd myset xulei
(integer) 1
127.0.0.1:6379> sadd myset2 hualin
(integer) 1
127.0.0.1:6379> sadd myset2 xiangni
(integer) 1
127.0.0.1:6379> smove myset myset2 xulei
(integer) 1
127.0.0.1:6379> SMEMBERS myset2
1) "xulei"
2) "xiangni"
3) "hualin"

########################################
应用:微博,b站 把所有关注的人放在一个set集合中,将它的粉丝也放在一个集合中。
数字集合类:
    差集:SDIFF
    交集:SINTER
    并集:SUNION
127.0.0.1:6379> sadd key1 a
(integer) 1
127.0.0.1:6379> sadd key1 b
(integer) 1
127.0.0.1:6379> sadd key1 c
(integer) 1
127.0.0.1:6379> sadd key2 c
(integer) 1
127.0.0.1:6379> sadd key2 d
(integer) 1
127.0.0.1:6379> sadd key2 e
(integer) 1
127.0.0.1:6379> SDIFF key1 key2
1) "b"

3.5 zset (有序列表)

zset 在set 的基础上增加了一个值,分组。set k1 v1 zset k1 score1 v1

它类似于SortedSet 和HashMap 的结合体,一方面它是一个set,保证了value 的唯一性,另一方面,它可以给每个value 赋予一个 score,代表这个value 的排序权重,它的内部实现用的是跳转列表的数据结构。

​

应用场景:

  • zset 可以用来存储粉丝列表,value 值是粉丝的用户Id ,score 是关注事件,可以按照关注时间排序。
  • zset 还可以用来存储学生的成绩,value 是学生的Id ,score 是考试成绩。

实操:



##########################
# ZRANGEBYSCORE 排序 min max
# ZREVRANGE :从大到小排序
# zrange : 从小到大排序

127.0.0.1:6379> zadd myset 1 one
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three
(integer) 2
127.0.0.1:6379> zrange myset 0 -1
1) "one"
2) "two"
3) "three"

127.0.0.1:6379> zadd salary 2500 xiaohon
(integer) 1
127.0.0.1:6379> zadd salary 9000 zhansan
(integer) 1
127.0.0.1:6379> zadd salary 200 xulei
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf
1) "xulei"
2) "xiaohon"
3) "zhansan"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores
1) "xulei"
2) "200"
3) "xiaohon"
4) "2500"
5) "zhansan"
6) "9000"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores
1) "xulei"
2) "200"
3) "xiaohon"
4) "2500"

127.0.0.1:6379> ZREVRANGE salary 0 -1
1) "zhansan"
2) "xiaohon"

##########################
# rem:移除rem中的元素:移除有序集合中的元素
# zcard:查看里面的元素个树
# zcount:计算区间内的个树

127.0.0.1:6379> zrange salary 0 -1
1) "xulei"
2) "xiaohon"
3) "zhansan"
127.0.0.1:6379> zrem salary xulei
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "xiaohon"
2) "zhansan"
127.0.0.1:6379> zcard salary
(integer) 2

127.0.0.1:6379> zadd myset 1 hello
(integer) 1
127.0.0.1:6379> zadd myset 2 world 3 xulei
(integer) 2
127.0.0.1:6379> zcount myset 1 3
(integer) 3

3.6 Hash (字典)

相当于 Java 语言 里面的HashMap ,也就是数组+链表组合。

hash 结构存储多个key-value ,可以对单独的key做获取,本质上和string 类型没有太大的区别。

hash 对比 string:

  • 1、如果存储的都是比较结构化的数据,比如用户数据缓存,特别是如果一个数据中如果字段比较多,但是每次只需要使用其中的一个或者少数的几个,使用hash 是一个好的选择,因为它提供了hget 和hmget,而无需取出所有数据在代码中处理。

  • 2、如果数据差异很大,需要把所有数据读取出来再处理,则用string 来完成

  • 3、hash缺点:存储消耗高于单个字符串。

常用命令:

  • hset key field value :给 key 集合中的 field 键赋值 value
  • hget key field value : 从key集合filed 属性中取值
  • hmset key field1 value field2 value :批量设置值
  • hmget key field1 value field2 value :批量获取值
  • hkeys key :获取所有field
  • hvals key :获取所有的value

基本命令实操:



#################################
# hset:存值
# hget: 取值
# hmset: 存多个值
# hmget: 取多个值
# hgetall: 获取所有的key value
# hdel: 删除指定的key
127.0.0.1:6379> hset myhash field1 xulei
(integer) 1
127.0.0.1:6379> hget myhash field1
"xulei"
127.0.0.1:6379> hset myhash field1 xulei
(integer) 1
127.0.0.1:6379> hget myhash field1
"xulei"
127.0.0.1:6379> hmset myhash field2 2 field3 3
OK
127.0.0.1:6379> hmget myhash field1 field2 field3
1) "xulei"
2) "2"
3) "3"
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "xulei"
3) "field2"
4) "2"
5) "field3"
6) "3"
127.0.0.1:6379> hdel myhash field2
(integer) 1

#################################
# hlen:查看hash表的字段数量
# hexists: 判断指定hash是否存在
# hkeys: 查看当前所有的key
# hvals:只获得所有的value

127.0.0.1:6379> hlen myhash
(integer) 2
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "xulei"
3) "field3"
4) "3"
127.0.0.1:6379> hexists myhash field1
(integer) 1
127.0.0.1:6379> hkeys myhash
1) "field1"
2) "field3"
127.0.0.1:6379> hvals myhash
1) "xulei"
2) "3"

################################
# hincryby :指定增量
# hsetnx : 如果存在则不能设置

127.0.0.1:6379> hset myhash field4 4
(integer) 1
127.0.0.1:6379> hincrby myhash field4 2
(integer) 6
127.0.0.1:6379> hincrby myhash field4 -4
(integer) 2
127.0.0.1:6379> 

解决pd.read_json报错ValueError: Trailing data问题 首先,我们使用open函数打开JSON文件,然后使用json.load函数将JSON文件数据解码为Python对象。在使用Python进行数据处理中,我们经常需要将JSON格式的数据读入到DataFrame中进行处理。而使用pandas库的read_json函数,就可以方便地将JSON数据读入到DataFrame中。但是有时候在读取JSON数据时,会遇到一个非常常见的错误:ValueError: Trailing data。这个错误的解决方案并不难,只需要在read_json中添加一个参数即可。 阅读详情

相关推荐

显示模组Bonding IC气泡问题的诊断与优化策略

本文深入分析了显示模组Bonding IC气泡问题的成因与优化策略,涵盖IC两端剥离气泡、彩虹状水汽气泡、电极下方无规律气泡及IC输入端气泡等类型。通过工艺参数优化、材料存储处理、清洁环境控制及维修品特殊处理等多维度解决方案,有效降低气泡不良率。同时介绍了纳米改性ACF材料、激光辅助排泡技术等前沿解决方案,为触控显示行业提供实用参考。

weixin_26805597的博客 420

Redis 五大基本类型详解

Redis 学习笔记(三)详细了解redis中的五大基本类型及其方法和用法

qq_63193362的博客 861

从CAD到完美网格:HyperMesh几何清理全流程指南(2023最新版)

本文详细介绍了2023最新版HyperMesh在几何清理和网格划分方面的全流程操作指南。从CAD导入、几何修复到中面提取和网格生成,系统性地分享了实战验证的解决方案,帮助工程师高效处理复杂几何体,提升有限元模型质量。特别针对汽车和航空航天领域的常见问题,提供了智能化工具和优化技巧。

weixin_29306011的博客 228

Redis的五大基本类型

Redis的基本数据结构是非常重要的,熟练的掌握Redis的基本数据结构会为之后的Redis学习有一个坚实的基础。 本文介绍了Redis的五大基本类型和其常用命令的使用,每个命令都有具体的示例演示,帮助理解。

小白的程序猿 698

Halcon dyn_threshold详解

dyn_threshold 原型 dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : ) 功能 利用局部阈值分割图像 参数列表 OrigImage (input_object):原始图像 ThresholdImage (input_object):处理后图像(一般采用滤波处理) RegionDynThresh (output_object):分割后区域 Offset (input_control):灰

ZiLiangQin的博客 1万+

【故障排查】telnet连接失败:端口23不可达的深度分析与解决方案

本文深度剖析了telnet连接失败,特别是端口23不可达的常见原因与系统性解决方案。文章从客户端本地配置、服务器端服务与防火墙、中间网络路径三个层面,提供了详细的排查步骤与命令,并强调了Telnet协议的安全风险,建议使用SSH等更安全的替代方案进行远程管理与端口测试。

weixin_29306011的博客 899

Redis面试必问:Redis为什么快?Redis五大基本数据类型

和上文提交的哈希对象不是同一个级别的产物,字典是Redis内部的数据结构,而哈希对象是提供给外部使用的。所以Redis内部会对有序集合采用字典和跳跃表两种实现,当使用对应不同场景时,就采用对应的不同数据结构来高效操作有序集合。跳跃表的查询效率是比较快的,可以和平衡二叉树相媲美,同时跳跃表相比平衡树的实现更加的简单。哈希键如果只包含少量的键值对,同时键、值都是类似小整数、短字符串类型的,会采用压缩列表的底层实现。列表键里如果包含的都是类似小整数、短字符串类型的,会采用压缩列表的底层实现。

程序员-杨胡广的博客 1464

让 ABAP 复杂内表优雅“喂饱”:Complex Internal Table Filling 全面实战指南

本文为ABAP开发者系统梳理了复杂内表的填充与复制方法。重点介绍了work area的两种声明方式、APPEND操作的多形态用法及其初始值语义,以及VALUE #( )构造器的逐行与整表写法。同时讲解了CORRESPONDING的同名字段映射功能,帮助开发者在"航司与航线"等复杂业务场景中实现最佳实践。文章还涵盖内存优化、可读性建议和常见误区,提供可运行样例,适用于ABAP On-Premise和SAP BTP环境。

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

redis五大基本类型

因此,字符串是最基本的 Redis 数据类型。当集合元素巨大时应当谨慎使用smember因为他的时间开销是O(n),并且会一次返回所有元素,最好的方法是使用sscan使用迭代的方式获取。事件追踪 - 使用hashkey记录过去时间发生的时间,并将事件的生命周期设置为一小时,便可记录过去一小时发生的事件。阻塞列表,通过brpop.blpop实现阻列表,当列表中没有数据时阻塞请求,等有数据输入或者请求过期时返回。Redis的List是一个字符串链表,通常被用于实现堆和栈,以及为后端服务实现消息队列。

qq_68824640的博客 785

专栏目录:Linux 内存管理子系统的进化——从 MM 到 HMM

专栏梳理了Linux内存管理子系统从经典MM到异构内存管理(HMM)的演进历程。内容分为六大部分:首先介绍经典MM基础,包括虚拟地址空间、页表、VMA等核心机制;其次分析MM通用框架如页表遍历、NUMA迁移等;然后探讨设备内存引入的关键技术,如ZONE_DEVICE和dev_pagemap;接着深入解析HMM核心机制及其与DMA的集成;随后通过多个实际驱动案例展示HMM应用;最后讨论大页支持等进阶主题。专栏采用"经典机制→问题→扩展方案"的三段式结构,帮助开发者理解Linux如何通过HMM实现设备内存管理。

图形/计算GPU的驱动与虚拟化技术分享园地 885

18、动态系统响应分析

本文系统地介绍了动态系统响应的分析方法,涵盖传递函数建模、特殊输入下的响应特性(如脉冲和阶跃响应)、终值与初值定理的应用、系统直流增益的计算,并深入探讨了一阶和二阶系统的时域特性。通过实例分析与MATLAB仿真,展示了不同参数对系统行为的影响。文章还总结了系统响应在控制设计与故障诊断中的实际应用,并展望了多变量、非线性及实时响应分析的未来研究方向。配合流程图,提供了清晰的系统分析与设计路径。

kite3的博客 144

redis五大基本类型以及应用场景

redis五大基本类型以及应用场景

一个天蝎座的程序猿! 9469

OmniDrive(3):逐行代码详解

模型效果: 端到端联合规划与推理 接下来,简单介绍下训练的配置 1.1 模型配置 模型基于sparse query based的3D Bev感知框架StreamPetr ,用query来编码动态目标(如车辆、行人)和静态地图元素(如车道线)。(1) tran、test和val数据配置 指定真值的文件路径: ann_file 指定输出处理的pipeline: 训练使用, test 和val使用 指定是否需要时序训练seq_mode (2)数据处理pipeline 自定义的Dataset 通过类实现,训

@bangbang的博客 721

Redis五大基本数据类型

目录 1.字符串 2.列表List 3.集合Set 4.哈希Hash 5.Zset 1.字符串 String是Redis最基本的类型,是二进制安全的,意味着Redis的string可以包含任何数据,比如jpg图片。 一个redis中字符串value最大是512M 常用命令 set <key><value> 添加键值对 get <key> 查询对应键值 append <key><value>将给定的<val...

雪月清的博客 4292

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Redis04_五大基本数据类型

Redis04_五大基本数据类型 String类型 append 给指定key追加值,如果当前key不存在,就相当于set key strlen 获取字符串的长度 127.0.0.1:6379> append name hello (integer) 8 127.0.0.1:6379> get name "BLUhello" 127.0.0.1:6379> strlen name (integer) 8 incr 将key中存储的数字值加1 i++ decr 将key中存储的数字

BLU_111的博客 11万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Redis入门-redis的五大数据类型+三种特殊的数据类型

Redis有五大基本类型字符串(string)哈希(hash)列表(list)集合(set)和有序集合(sorted set)。字符串(string)是Redis最基本的类型,可以存储任意类型的数据,如整数、浮点数、二进制数据等。字符串类型的操作包括设置键值对、获取值、增减值等。哈希(hash)是一个键值对的集合,类似于关联数组。哈希类型适合存储对象,对象的属性作为键,属性值作为值。哈希类型的操作包括设置键值对、获取值、删除键值对等。列表(list)是一个链表结构,可以存储有序的字符串元素。

小孔靠得住的博客 1673

Redis基本命令手册——五大类型

redis5版本的命令小手册

m0_73233932的博客 1037

Redis经典五大类型源码及底层实现

Redis经典五大类型源码及底层实现

qq_63754844的博客 1481

Redis 的五大基本数据类型操作

Redis 的五大基本数据类型 String,List,Set,Hash,Zset

qq_44704799的博客 1174

【Redis八股|第2篇】Redis 五大基本数据类型详解

上一篇我们学习了 Redis 是什么,以及 Redis 为什么这么快。五大基本数据类型。Redis 虽然是 key-value 数据库,但它的 value 并不只是普通字符串。StringHashListSetZSetRedis 有哪些数据类型?String 可以用来做什么?Hash 适合存对象吗?List 和 Set 有什么区别?ZSet 为什么适合做排行榜?项目中怎么选择 Redis 数据类型?这一篇我们就把 Redis 五大基本数据类型完整梳理一遍。不是。

2401_88139521的博客 617

Redis五大数据类型

五大数据类型介绍 redis 中的数据都是以 key/value 的形式存储的,五大数据类型主要是指 value 的数据类型,包含如下五种: STRING STRING 是 redis 中最基本的数据类型,redis 中的 STRING 类型是二进制安全的,即它可以包含任何数据,比如一个序列化的对象甚至一个 jpg 图片,要注意的是 redis 中的字符串大小上限是 512M 。 LIST LIST 是一个简单的字符串列表,按照插入顺序进行排序,我们可以从 LIST 的头部 (LEFT) 或者尾部 (RIG

m0_54797663的博客 3201

【速成Redis】02 Redis 五大基本数据类型常用命令

该篇适用于速成redis。本篇我们将讲解:redis五大基本数据类型的常用语句。

weixin_71246590的博客 1471

Redis:从NoSQL到五大数据类型及基本命令

Redis学习笔记摘要 本文介绍了NoSQL数据库Redis的基础知识与应用。主要内容包括:1) NoSQL发展背景,从单机MySQL到分库分表再到Redis等NoSQL解决方案;2) Redis核心特性:高性能、多样数据类型、持久化等;3) 基本操作命令,如String类型的set/get/incr,List类型的lpush/rpop等;4) Redis单线程高性能原理,基于内存操作避免上下文切换;5) 实际应用场景如缓存、计数器、消息队列等。Redis作为主流NoSQL数据库,适用于大数据量、高并发的互

ysy1648067239的博客 727

Redis常用五大基本数据类型

Redis常用五大基本数据类型

qq_38154295的博客 799

【Redis】五大基本类型命令详解

大家好,我是被白菜拱的猪。 一个热爱学习废寝忘食头悬梁锥刺股,痴迷于girl的潇洒从容淡然coding handsome boy。 文章目录基本数据类型(一)字符串(strings)1、设置值、获得值、追加值、获取字符串长度2、自增自减3、字符串范围getrange [x,x]4、setex,setnx5、mset,mget6、getset(二)列表(lists)1、lpush、lpop、lrange2、lindex3、llen4、lrem5、ltrim6、rpoplpush7、lset8、linsert

放开这颗白菜让我来 564

Redis基础(二)——通用命令与五大基本数据类型

Redis基础(二)——通用命令与五大基本数据类型

雷神乐乐的博客 1279
上一篇: Redis指南【1】为什么时间选择了NoSQL?
下一篇: Redis指南【3】 特殊结构和高级用法
加班不秃顶
博客等级 码龄7年 1822粉丝 599原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值