redis - [07] 数据类型

  redis是一个开源(BSD许可)的,内存中的数据结构存储系统,可以用作数据库、缓存和消息中间件MQ。它支持多种类型的数据结构,如字符串(String)、散列(Hash)、列表(List)、集合(Set)、有序集合(Sorted Sets)与范围查询(bitmaps、hyperloglogs)和地理空间(geospatial)索引半径查询。Redis内置了复制(replication)、LUA脚本(Lua Scripting)、LRU驱动事件、事务(Transactions)和不同级别的磁盘持久化(Persistence),并通过Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性。redis不区分大小写命令。

 

000 || redis-key

127.0.0.1:6379> set name harley # 设置key
OK
127.0.0.1:6379> 
127.0.0.1:6379> keys *    # 查看当前数据库中所有的key
1) "name"
127.0.0.1:6379> 
127.0.0.1:6379> exists name # 查看是否存在某key
(integer) 1
127.0.0.1:6379> 
127.0.0.1:6379> move name 1 # 移除key
(integer) 1
127.0.0.1:6379> 
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> 
127.0.0.1:6379> set name harley
OK
127.0.0.1:6379> 
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> 
127.0.0.1:6379> clear # 清屏
127.0.0.1:6379> expire name 10 # 设置name的过期时间为10s
(integer) 1
127.0.0.1:6379> ttl name # 查看name的剩余过期时间
(integer) 7
127.0.0.1:6379> ttl name
(integer) 3
127.0.0.1:6379> get name # 查看name的值
(nil)
127.0.0.1:6379> set name harley
OK
127.0.0.1:6379> type name # 查看key的类型
string
127.0.0.1:6379>

过期时间可以用于设置cookie的过期时间设置

 

 

001 || String

90%的java程序员使用redis只会使用一个String类型

127.0.0.1:6379> set key1 v1  # 设置值
OK
127.0.0.1:6379> get key1 # 获得值
"v1"
127.0.0.1:6379> keys * # 查看所有的键
1) "key1"
127.0.0.1:6379> exists key1 # 判断某key是否存在
(integer) 1
127.0.0.1:6379> append key1 "hello" # 追加字符串,如果key1不存在即新建
(integer) 7
127.0.0.1:6379> get key1 # 查看键
"v1hello"
127.0.0.1:6379> 
127.0.0.1:6379> STRLEN key1 # 获取字符串的长度
(integer) 7
127.0.0.1:6379> APPEND key1 harley
(integer) 13
127.0.0.1:6379> STRLEN key1
(integer) 13
127.0.0.1:6379> get key1
"v1helloharley"
127.0.0.1:6379>

计数器

127.0.0.1:6379> 
127.0.0.1:6379> set views 0 # 初始值为0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> INCR views # 自增1
(integer) 1
127.0.0.1:6379> get views
"1"
127.0.0.1:6379> INCR views
(integer) 2
127.0.0.1:6379> INCR views
(integer) 3
127.0.0.1:6379> get views
"3"
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> decr views # 自减1
(integer) 2
127.0.0.1:6379> decr views
(integer) 1
127.0.0.1:6379> 
127.0.0.1:6379> get views
"1"
127.0.0.1:6379> 
127.0.0.1:6379> INCRBY views 10 # 步长10,自增10
(integer) 11
127.0.0.1:6379> 
127.0.0.1:6379> DECRBY views 5 # 自减5
(integer) 6

字符串范围

127.0.0.1:6379> set key1 "hello,harley" # 设置key1的值
OK
127.0.0.1:6379> get key1
"hello,harley"
127.0.0.1:6379> GETRANGE key1 0 3 # 截取字符串[0,3]
"hell"
127.0.0.1:6379> GETRANGE key1 0 -1 # 获取全部的字符串 等同于get key
"hello,harley"
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> SETRANGE key2 1 hello # 替换指定位置开始的字符串
(integer) 7
127.0.0.1:6379> get key2
"ahellog"
127.0.0.1:6379> 

setex & setnx

127.0.0.1:6379> setex key3 30 "hello" # 设置过期时间30s, set with expire
OK
127.0.0.1:6379> ttl key3
(integer) 27
127.0.0.1:6379> get key3
"hello"
127.0.0.1:6379> setnx mykey "redis" # 不存在设置(在分布式锁中会常常使用)
(integer) 1
127.0.0.1:6379> ttl key3
(integer) -2
127.0.0.1:6379> keys *
1) "key2"
2) "mykey"
3) "key1"
127.0.0.1:6379> setnx mykey "MongoDB"# 如果当前key存在则创建失败,返回0
(integer) 0
127.0.0.1:6379> get mykey
"redis"
127.0.0.1:6379> 

批量设置值

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 # 批量设置值
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k1"
3) "k2"
127.0.0.1:6379> 
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 # 是一个原子性操作,k1已存在,所以执行失败
(integer) 0
127.0.0.1:6379> keys *
1) "k3"
2) "k1"
3) "k2"
127.0.0.1:6379> 

对象

127.0.0.1:6379> mset user1:1:name zhangsan user1:1:age 18 # 设置name和age
OK
127.0.0.1:6379> mget user1:1:name user1:1:age # 批量获取值
1) "zhangsan"
2) "18"
127.0.0.1:6379> 

getset

127.0.0.1:6379> getset db redis # 先返回get的值,再进行set
(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"

 

适用场景

String类似的使用场景,value除了字符串还可以是数字

  • 计数器
  • 统计多单位的数量:uid:572413118:follow 0
  • 粉丝数
  • 对象存储

 

 

002 || List

基本的数据类型,列表。在redis里可以把list当做栈、队列、阻塞队列

可以在list的左右两边同时插入值

127.0.0.1:6379> lpush list one # 将一个值或者多个值插入到列表的最左边
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1 # 获取到列表的所有值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 1
1) "three"
2) "two"
127.0.0.1:6379> lrange list 0 0 # 获取最新插入的值
1) "three"
127.0.0.1:6379> 
127.0.0.1:6379> Rpush list four # 将值插入到列表最右边
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
127.0.0.1:6379> 
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
127.0.0.1:6379> Lpop list # 移除list第一个元素
"three"
127.0.0.1:6379> 
127.0.0.1:6379> Rpop list # 移除list最后一个元素
"four"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> 
127.0.0.1:6379> lindex list 1 # 通过下标获取list中某一个值
"one"
127.0.0.1:6379> lindex list 0 
"two"
127.0.0.1:6379> 

获取到列表的长度

127.0.0.1:6379> Lpush list one
(integer) 1
127.0.0.1:6379> Lpush list two
(integer) 2
127.0.0.1:6379> Lpush list three
(integer) 3
127.0.0.1:6379> 
127.0.0.1:6379> Llen list # 获取列表的值
(integer) 3
127.0.0.1:6379> 

移除元素

127.0.0.1:6379> lpush list one
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> llen list
(integer) 3
127.0.0.1:6379> lpush list three
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrem list 1 one # 移除list指定个数的value
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379> lrem list 2 three # 移除list中指定个数的value
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"
127.0.0.1:6379>

只保留一部分值trim操作

127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpush mylist "hello3"
(integer) 4
127.0.0.1:6379> ltrim mylist 1 2 # 通过下标截取指定的长度,list的值发生变化
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello2"
127.0.0.1:6379> 

rpoplpush

移除列表的最后一个元素,并将其移动到新的列表中

127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpoplpush mylist myotherlist
"hello2"
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "hello1"
127.0.0.1:6379> lrange myotherlist 0 -1
1) "hello2"
127.0.0.1:6379> 

lset

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

127.0.0.1:6379> exists list # 判断这个列表是否存在
(integer) 0
127.0.0.1:6379> lset list 0 item # 如果不存在列表,更新时会报错
(error) ERR no such key
127.0.0.1:6379> 
127.0.0.1:6379> lpush list value1
(integer) 1
127.0.0.1:6379> lrange list 0 0
1) "value1"
127.0.0.1:6379> lset list 0 item # 如果存在,则会更新指定下标的值
OK
127.0.0.1:6379> lrange list 0 0
1) "item"
127.0.0.1:6379> 
127.0.0.1:6379> lset list 1 other # 如果不存在,则会报错
(error) ERR index out of range
127.0.0.1:6379> 

linsert

将某个具体的value插入到list中某个元素的前面或者后面

127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "world"
(integer) 2
127.0.0.1:6379> linsert mylist before world my
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "my"
3) "world"
127.0.0.1:6379> linsert mylist after my only
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "my"
3) "only"
4) "world"
127.0.0.1:6379> 

 

  • 实际上是一个链表,before Node after,可以在left和right都可以插入值
  • 如果key不存在,则创建新的链表
  • 如果key存在,则新增元素
  • 如果移除了所有的值,则为空链表
  • 在两边插入或者更新值,效率最高!中间元素,效率会比较低。

适用场景

  • 消息队列

 

 

003 || Set

 

127.0.0.1:6379> sadd myset hello # 向set中添加元素
(integer) 1
127.0.0.1:6379> sadd myset harley
(integer) 1
127.0.0.1:6379> smembers myset # 查看set中的值
1) "harley"
2) "hello"
127.0.0.1:6379> sadd myset loveyl
(integer) 1
127.0.0.1:6379> smembers myset 
1) "harley"
2) "loveyl"
3) "hello"
127.0.0.1:6379> sadd myset hello # set中的值是无序且不重复的
(integer) 0
127.0.0.1:6379> 
127.0.0.1:6379> sismember myset harley # 查看set中是否存在某值
(integer) 1
127.0.0.1:6379> sismember myset hello
(integer) 1

scard

获取set集合中内容元素个数

127.0.0.1:6379> smembers myset
1) "harley"
2) "loveyl"
3) "hello"
127.0.0.1:6379> scard myset
(integer) 3

srem

移除set中的指定值

127.0.0.1:6379> srem myset hello
(integer) 1
127.0.0.1:6379> smembers myset
1) "harley"
2) "loveyl"
127.0.0.1:6379> scard myset
(integer) 2
127.0.0.1:6379> 

srandmemeber

随机抽选出一个元素

127.0.0.1:6379> smembers myset
1) "hahaha"
2) "harley"
3) "world"
4) "loveyl"
5) "hello"
127.0.0.1:6379> srandmember myset
"harley"
127.0.0.1:6379> srandmember myset
"world"
127.0.0.1:6379> srandmember myset
"hello"
127.0.0.1:6379> srandmember myset
"loveyl"
127.0.0.1:6379> 
127.0.0.1:6379> srandmember myset 2
1) "loveyl"
2) "world"
127.0.0.1:6379> 

spop

随机删除一个元素

127.0.0.1:6379> spop myset
"hello"
127.0.0.1:6379> spop myset
"hahaha"
127.0.0.1:6379> smembers myset
1) "loveyl"
2) "harley"
3) "world"
127.0.0.1:6379> 

smove

将一个指定的值移动到另外一个set中

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 harley
(integer) 1
127.0.0.1:6379> smove myset myset2 harley
(integer) 1
127.0.0.1:6379> smembers myset2
1) "harley"
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
127.0.0.1:6379> 

差集 & 交集 & 并集

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) "a"
2) "b"
127.0.0.1:6379> sinter key1 key2 # 交集
1) "c"
127.0.0.1:6379> 
127.0.0.1:6379> sunion key1 key2 # 并集
1) "a"
2) "b"
3) "c"
4) "e"
5) "d"
127.0.0.1:6379> 

 

004 || Hash

127.0.0.1:6379> hset myhash field1 harley # set一个具体的key-value
(integer) 1
127.0.0.1:6379> hget myhash field1
"harley"
127.0.0.1:6379> hmset myhash field1 hello field2 world # set多个key-value
OK
127.0.0.1:6379> hmget myhash field1 field2 # 获取多个字段值
1) "hello"
2) "world"
127.0.0.1:6379> hgetall myhash # 获取全部数据
1) "field1"
2) "hello"
3) "field2"
4) "world"
127.0.0.1:6379> hdel myhash field1 # 删除指定的key,value也会被删除
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
127.0.0.1:6379> 
127.0.0.1:6379> hlen myhash # 查看hash的字段数量
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379> hexists myhash field1 # 判断hash中指定字段是否存在
(integer) 0
127.0.0.1:6379> hexists myhash field2
(integer) 1
127.0.0.1:6379> 
127.0.0.1:6379> hkeys myhash # 获取所有的字段
1) "field2"
127.0.0.1:6379> hvals myhash # 获取所有的值
1) "world"

hincrby & hsetnx

127.0.0.1:6379> hset myhash field3 5 
(integer) 1
127.0.0.1:6379> hincrby myhash field3 1 # 指定增量
(integer) 6
127.0.0.1:6379> hgetall myhash
1) "field3"
2) "6"
127.0.0.1:6379> hincrby myhash field3 -2
(integer) 4
127.0.0.1:6379> hgetall myhash
1) "field3"
2) "4"
127.0.0.1:6379> hsetnx myhash field4 hello # 如果不存在可以设置值
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 world # 如果存在则会执行失败
(integer) 0
127.0.0.1:6379> 

hash变更的数据user

127.0.0.1:6379> hset user:1 name harley
(integer) 1
127.0.0.1:6379> hget user:1 name
"harley"
127.0.0.1:6379> 

适用场景

  • 可以用于存储用户信息、经常变动的信息。
  • hash更适合于对象的存储,String更适合字符串存储。

 

 

005 || Zset

有序集合,在set的基础上增加了一个值

127.0.0.1:6379> zadd myzset 1 one
(integer) 1
127.0.0.1:6379> zadd myzset 2 two
(integer) 1
127.0.0.1:6379> zadd myzset 3 three 4 four # 添加多个值
(integer) 2
127.0.0.1:6379> zrange myzset 0 -1
1) "one"
2) "two"
3) "three"
4) "four"
127.0.0.1:6379> 

zrangebyscore

排序

127.0.0.1:6379> zadd salary 2500 harley
(integer) 1
127.0.0.1:6379> zadd salary 5000 cc_zeal
(integer) 1
127.0.0.1:6379> zadd salary 500 jone
(integer) 1
127.0.0.1:6379> zrangebyscore salary -inf +inf # 按照score升序排列
1) "jone"
2) "harley"
3) "cc_zeal"
127.0.0.1:6379> 
127.0.0.1:6379> zrevrange salary 0 -1 # 降序排列
1) "cc_zeal"
2) "harley"
3) "jone"
127.0.0.1:6379> 
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores
1) "jone"
2) "500"
3) "harley"
4) "2500"
5) "cc_zeal"
6) "5000"
127.0.0.1:6379>
127.0.0.1:6379> zrangebyscore salary -inf 2500 withscores # 显示小于2500的升序排列
1) "jone"
2) "500"
3) "harley"
4) "2500"
127.0.0.1:6379> 

zrem

127.0.0.1:6379> zrange salary 0 -1
1) "jone"
2) "harley"
3) "cc_zeal"
127.0.0.1:6379> zrem salary jone # 移除有序集合中指定的元素
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "harley"
2) "cc_zeal"
127.0.0.1:6379> 
127.0.0.1:6379> zcard salary # 获取有序集合中的个数
(integer) 2
127.0.0.1:6379> 
127.0.0.1:6379> zadd myset 1 hello
(integer) 1
127.0.0.1:6379> zadd myset 2 world 3 harley
(integer) 2
127.0.0.1:6379> zcount myset 1 3 # 获取指定区间成员数量
(integer) 3
127.0.0.1:6379> zcount myset 1 2
(integer) 2
127.0.0.1:6379> 

 

006 || Geospatial

地理位置,推算地理位置的信息,两地之间的距离。

geoadd

添加地理位置,两极无法直接添加,一般会下载城市数据,用java程序一次性导入

key 值(维度、精度、名称)

127.0.0.1:6379> geoadd china:city 116.40 39.90  beijing # 添加城市的坐标
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23  shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing
(integer) 1
127.0.0.1:6379> geoadd china:city 114.05 22.52 shenzhen
(integer) 1
127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 108.96 34.26  xian
(integer) 2

geops

127.0.0.1:6379> geopos china:city beijing # 获取指定城市的经度纬度
1) 1) "116.39999896287918091"2) "39.90000009167092543"
127.0.0.1:6379> geopos china:city beijing shanghai
1) 1) "116.39999896287918091"2) "39.90000009167092543"
2) 1) "121.47000163793563843"2) "31.22999903975783553"
127.0.0.1:6379> 

geodist

127.0.0.1:6379> geodist china:city beijing shanghai # 获取两地的直线距离
"1067378.7564"
127.0.0.1:6379> 
127.0.0.1:6379> geodist china:city beijing shanghai km # 获取两地的直线距离(单位km)
"1067.3788"
127.0.0.1:6379> 

georadius

以给定的经纬度为中心,找出某一半径内的元素

127.0.0.1:6379> georadius china:city 110 30 1000 km
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
127.0.0.1:6379> georadius china:city 110 30 500 km
1) "chongqing"
2) "xian"
127.0.0.1:6379> 
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord # 经纬度
1) 1) "chongqing"2) 1) "106.49999767541885376"2) "29.52999957900659211"
2) 1) "xian"2) 1) "108.96000176668167114"2) "34.25999964418929977"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist # 直线距离
1) 1) "chongqing"2) "341.9374"
2) 1) "xian"2) "483.8340"

georadiusbymember

找出指定元素周围的其他元素

127.0.0.1:6379> georadiusbymember china:city shanghai 500 km
1) "hangzhou"
2) "shanghai"
127.0.0.1:6379> 

geohash

将二维的经纬度转换为一维的字符串,如果两个字符串越接近,距离越接近

127.0.0.1:6379> geohash china:city beijing chongqing
1) "wx4fbxxfke0" # 经纬度hash
2) "wm5xzrybty0" # 经纬度hash
127.0.0.1:6379> 

清除

geo底层是zset,可以使用zset的命令清除掉geo的元素

127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> zrem china:city xian
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "shenzhen"
3) "hangzhou"
4) "shanghai"
5) "beijing"
127.0.0.1:6379> 

 

007 || Hyperloglog

 

 

 

008 || bitmap

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/889843.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

再论支付账务

支付账务是金融领域中复杂且关键的一环,涉及资金流动、风险控制和业务效率等多个方面。本文从支付结算的专业视角出发,深入剖析了支付账务的核心逻辑,包括会计科目设置、对账结算流程以及账务核算的关键要点。学习账务的时候你是否经常有这些疑问“待结算和待清算是什么?为…

分享[清华大学DeepSeek教程全家桶]下载地址

干货分享,最新整理的清华大学DeepSeek教程全家桶,内容如下:内容展示下载地址🎁🎁 文末福利,后台回复[603]获取下载地址 📢📢 喜欢这篇文章?欢迎大家✨关注 ❤️点赞 ➡️转发 分享给那些需要的朋友!如果认为此文对您有帮助,别忘了支持一下哦!声明:本博客原创文…

求二叉搜索树的第 K 小的值

题目:一个二叉搜索树,求其中的第K小的节点值。如下图,第3小的节点是4什么是二叉树:是一棵树   每个节点最多能有 2 个字节点。数据结构如下:{value, left,right}interface ITreeNode {value: number // 或其它类型left?: ITreeNoderight?:ITreeNode }上图中的二叉树结…

百万架构师第四十四课:Nginx:Nginx 的扩展-OpenRestry|JavaGuide

百万架构师系列文章阅读体验感更佳 原文链接:https://javaguide.net 公众号:不止极客 Nginx 的扩展-OpenRestry 课程目标Nginx 进程模型简介Nginx 的高可用方案OpenResty 安装及使用什么是 API 网关?OpenResty 实现灰度发布功能Nginx 进程模型简介 多进程TomcatBIO NIO AION…

不用 ORM 会发生什么?

要弄清一个事物带来了什么,有种办法就是在场景中去掉它,当我们不使用 ORM 开发项目,需要补齐哪些能力,以表格形式列举要补齐的功能点和意义。我们仅能通过 SQL语句和数据库交互,在采用 ORM 项目开发的项目有时出于性能、数据库表达限制的原因而直接编写 SQL 语句,在脱离 …

事务中无法切换数据源?DataSourceSwitchInvoker:轻松实现多数据源切换执行工具类

背景: 在有标注为@Transactional的类或公共方法中(传播特性,如:NOT_SUPPORTED、SUPPORTS、REQUIRED【默认值】、REQUIRES_NEW)执行数据源切换可能不成功(比如:主从数据源切换,多数据源切换等,均会发现切换不成功,或“偶尔又切换成功”),导致本应该需要查主库却查了…

Java基础05(常用类)

匿名内部类 Object类 包装类 String类 BigDecimal类 Date类(特定时间)Calendar类(日历)SimpleDateFormat类(格式化时间)System类(系统类)Java基础05(常用类) 内部类 成员内部类在类的内部定义,与实例变量、实例方法同级别的类外部类的一个实例部分,创建内部类对象…

mysql表字段varchar(10)和varchar(255)测试文件占用

前言全局说明一、说明 1.1 环境: Windows 11 家庭版 23H2 22631.3737 MySQL: 服务器版本: 5.6.34 - MySQL Community Server (GPL) Navicat for MySQL: 10.1.71.2 测试样本 两个字段: id字段是 1~10位不等长度的随机数; num字段是 11~25位不等的随机数字;为了更好模拟实际使…

FreeRTOS高效应用实战

FreeRTOS高效应用实战 基于STM32CubeIDE生成对芯片移植好的FreeRTOS工程,使用HAL库编写FreeRTOS应用程序,实现FreeRTOS高效应用实战引入函数句柄的概念函数句柄(Function Handle)是编程中用于间接引用和操作函数的一种机制,其本质是将函数作为数据来传递和存储。以下是关于…

解决ZYNQ-7020开发板使用vitis编译uboot报错和无法正常调试的问题

整个学习过程是参考正点原子启明星开发板的2020.2版本嵌入式Linux开发指南,在学习uboot移植的时候遇到了问题。 新建工程和配置环境啥的和教程里都一样,就不罗嗦了,这里重点讲和教程不一样的地方(或者说教程里有问题的地方)。 新建工程后编译时遇到的报错 在按照教程新建ub…

markDown学习日记

标题 标题是通过#和一个空格来创建,标题的等级是通过#的个数来鉴别。 字体样式 进步进步进步 加粗效果由2个*前后包裹来实现 进步进步进步 斜体需要一个*来实现 (两者都实现需要三个*) 进步进步进步 删除需要两边都用波浪号 ~ 实现 引用明德新民 止于至善用>实…