数据库
从心归零
这个作者很懒,什么都没留下…
展开
-
tidb的排序和分页的两个bug
之前tidb就遇到过一个问题,在没有指定排序的情况下,每次查询语句顺序都是不同的,更不用说分页了。加上排序后每次查询的数据倒是相同的,于是就不管了,但是最近又发现了问题。运维反馈同一个产品在不同的分页中重复出现,多次尝试执行语句后发现是因为排序的字段有重复。在tidb中,如果排序的字段有重复,那么在固定分页的情况下,比如limit 0,30,返回的数据是固定排序的,但是你改变分页,比如改成limit 30,30,你会发现之前limit 0,30中的数据可能会出现在limit 30,30页面中。不仅如原创 2020-07-07 16:03:00 · 3383 阅读 · 4 评论 -
用REGEXP语句实现判断两个字符串组合之间是否有交集
之前做了一个呼叫功能,呼叫项目和人员之间通过标签关联。比如呼叫项目关联a标签,b标签,人员关联b标签,c标签。方式是通过一个字段保存了用逗号分割的标签id。只要他们关联了同一个标签,到时候呼叫就通知到那个人员。不过后来需求改了要直接把呼叫关联到人员。这个时候我就需要修改的过去数据,把呼叫的id直接关联到人员。如果用java写代码的话这是很简单的,不过我想用语句实现,查找资料后判断两个字符串组合...原创 2020-03-13 11:26:22 · 917 阅读 · 0 评论 -
uuid改造成数值型的算法
主管提出一个想法,把uuid改造成数值型的,并且让同一个公司的数据id更相近,一是节省了空间,二是tidb需要数值型id来分库分表,而且同一家公司的数据id更接近或许能提高查询效率吧,大概。公司使用两个字节的数值型 256*256,就是说最多有65536家公司,一般来说是够用了。然后其他数据的id则使用八个字节。从二进制的结构来说,前两个字节保存公司id,中间四个字节保存时间的秒数,后两个...原创 2020-02-26 11:45:33 · 3086 阅读 · 0 评论 -
mysql统计有条件的数据数量
有一个需求就是统计某个任务单状态的数量,当然我们可以使用group语句,比如select status,count(1) from task group by status查询一个列表出来。一般来说是可以的,但是这时候加一个条件,再让任务单以机器的id统计,那就麻烦了。select status,machineId,count(1) from task group by machi...原创 2019-10-26 17:59:52 · 3692 阅读 · 0 评论 -
tidb修改字段类型的办法
tidb有很多的限制,比如新增修改和删除字段一次只能执行一条,比如sql语句比如update一次只能执行几万条。比如不能修改字段的类型。之前我要修改字段类型只能先把tidb的数据先迁移到mysql上,然后在mysql里面的字段类型修改后,再直接覆盖tidb里的表。在开发阶段是可以的,但是在产品上线以后,时刻产生新的数据,如果要保证正确性,只能停止服务器,但是数据量大的时候,迁移数据的速度会非常...原创 2019-09-21 14:46:43 · 5669 阅读 · 0 评论 -
tidb的乐观锁功能bug
之前曾经用过springboot自带的乐观锁功能,就是在实体类中增加一个版本号字段,加上@Version注解。当时测试的时候是可以的,当实体类版本不对的时候,调用save方法就会抛出ObjectOptimisticLockingFailureException异常。但是后面我想加一个切面实现重试机制的时候发现突然行不通了,在tidb的环境下,会执行update set......where id ...原创 2019-04-16 14:58:10 · 1222 阅读 · 1 评论 -
使用exists查询记录是否存在
在使用rocketmq消息中心时,为了保证幂等我专门建了个消息消费记录表,每个消息消费后都往消息消费记录中插一条数据,在消息到达时通过判断是否在消息消费记录中存在这个消息来保证幂等。但是因为我把很多事件都放到队列中,所以消息的数量是十分之多的,一天能产生几十万条消息,而查询消息消费记录的代码执行频率十分之高,这时候我发现使用select count(*) 的效率急剧下降。我赶紧建了个定时器定时...原创 2018-10-09 11:01:51 · 3224 阅读 · 0 评论 -
springboot redis缓存功能的初步了解和使用
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <...原创 2018-06-04 18:26:55 · 181 阅读 · 0 评论 -
ehcache模糊批量移除缓存(转载)
spring-redis实在有太多局限性,用@CacheEvict删除缓存要么只能根据id删除,要么只能全部删除。没有批量模糊条件删除的功能,于是我在网上找了半天资料,发现一个用ehcache,然后自己实现模糊条件删除的文章,虽然和我用的不知道是不是同一个东西,但是也是使用@Cacheable、@CachePut、@CacheEvict三个标签的。先记录一下网址,明天再分析https://www....转载 2018-06-05 20:19:21 · 1915 阅读 · 0 评论 -
使用切面注解编程实现redis模糊删除数据之一
之前使用spring-redis,发现没有根据模糊查询删除redis,局限性很大,比如我有两个权限表,模块权限表baseModule,和按钮权限表baseButton。我把权限进行了缓存,然后在登陆时删除缓存,模块权限的保存名是baseModulePermissionList+#userId,按钮权限表的保存名是baseButtonPermissionList+#userId+#moduleId,...原创 2018-06-07 10:45:24 · 819 阅读 · 4 评论 -
使用切面注解编程实现redis模糊删除数据之二使用spel表达式
传送门:使用切面注解编程实现redis模糊删除数据之一之前虽然用切面编程实现了redis的模糊查询,但是却没有实现像spring-redis原生的语法一样的spEl表达式,比如#参数名这种形式,然后在网上找了一些资料,实现了和spring-redis一样的spEl表达,可以使用#参数名或者#p0这样的方式,下面是代码import java.lang.reflect.Method;import j...原创 2018-06-07 12:19:36 · 750 阅读 · 0 评论 -
hibernate的addScalar导致的@JsonFormat注解失效
之前使用hibernate的query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(Model.class))的方式来返回自定义的对象,但是有个问题,那就是返回的类型千奇百怪,bigInteger,bigDecimal之类的各不相同,当使用不同的查询返回相同的对象时就出问题了,我得吐槽一点,hiberna...原创 2018-06-21 11:02:19 · 652 阅读 · 0 评论