直接在数据增加一条数据,redis怎么没缓存到数据?

我在数据库中直接增加了一条数据,或者修改了一条数据,然后我在程序之间检索输出
打印,没有打印出我增加的数据。
图片说明
控制台打印:
图片说明
想请问下,这个是什么原因?

2个回答

两个方面原因,1:直接对数据库操作,系统缓存不会自动刷新,要清空系统缓存,
2.对oracle数据库操作后需要提交commit一下才能生效;两个原因你看一下是哪个
tanzhming
简若宁 我应该是第一个原因,但是我想实现的我手动修改了数据库之后,系统能自动的清空缓存,这个有什么解决方法没有?
接近 3 年之前 回复

你数据库修改了,是如何同步到redis,需要你自己用程序等主动去刷新

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
redis分页缓存减少缓存数据量

怎么用redis实现分页缓存,比如有1000页数据,只缓存当前页的后两页,点击到其他页时再缓存当前页的后两页。

使用redis做数据缓存操作list问题

如果使用redis做数据缓存,单个对象可以使用(对象名+id)做key,如果是list的话怎么办? 应该用什么做key?然后当数据新增记录时怎么更新这个list?

redis 分页缓存,跳着翻页会出现数据错乱

我现在的实现方式是:用zadd存id,然后用set存具体的对象。 Jedis jedis = getJedis(); jedis.set(key+id.toString(), JsonUtil.toJson(value)); //存对象 jedis.zadd(key, score, id.toString()); //存ID 现在的情况是正常翻页缓存没问题,但是从第一页跳到第三页,就会造成重新访问缓存的时候第二页的数据是第三页的数据

redis与java实现缓存查询,log日志

我现在开发遇到两个难点,大伙给我个思路.....1.用户要求保存数据更新日志,要求有数据原值,跟修改后的值.我倒是想到几个办法,但是感觉太麻烦,有没有简略的.2.redis缓存,用户查询的数据要用redis存起来,这样的话查询条件怎么处理,我不能一个查询条件就保存一条结果缓存吧.redis对数据操作能做到根据条件吗?注:我们的开发框架是springmvc+mybaits.

能写一个Util将下面json格式数据info.json,用io读完存到redis缓存中??在线等!!!大概有100w条数据

{"RECORDS"=>[{"id"=>1000000059, "account"=>"0040140072", "content"=>[{"SH600345"=>{"IR"=>"", "LT"=>"20.8", "GT"=>"20.83", "DR"=>"", "interval"=>"12"}}, {"SH600837"=>{"IR"=>"1", "LT"=>"16.18", "GT"=>"16.18", "DR"=>"1", "interval"=>"12"}}, {"SZ000886"=>{"IR"=>"", "LT"=>"6.41", "GT"=>"6.43", "DR"=>"", "interval"=>"12"}}, {"SZ300509"=>{"IR"=>"", "LT"=>"87.45", "GT"=>"87.65", "DR"=>"", "interval"=>"12"}}, {"SZ300076"=>{"IR"=>"", "LT"=>"15.40", "GT"=>"15.40", "DR"=>"", "interval"=>"12"}}, {"SZ002452"=>{"IR"=>"", "LT"=>"11.90", "GT"=>"12.15", "DR"=>"", "interval"=>"12"}}, {"SZ300515"=>{"IR"=>"", "LT"=>"61.89", "GT"=>"61.91", "DR"=>"", "interval"=>"12"}}, {"SH603861"=>{"IR"=>"", "LT"=>"40.90", "GT"=>"41.23", "DR"=>"", "interval"=>"12"}}, {"SH600466"=>{"IR"=>"", "LT"=>"8.06", "GT"=>"8.08", "DR"=>"", "interval"=>"12"}}, {"SZ002127"=>{"IR"=>"", "LT"=>"10.63", "GT"=>"10.66", "DR"=>"", "interval"=>"12"}}], "cid"=>"8ffa3310da8101a5b2ab1c47a039a77c", "updatetime"=>"2017-02-10 10:29:51"}, {"id"=>1000000062, "account"=>"0040127361", "content"=>[{"SZ002032"=>{"IR"=>"3.32", "DR"=>"3.42", "interval"=>"12", "GG"=>"1", "HS"=>"77", "GTZS"=>"2", "LTZS"=>"3"}}, {"SZ002881"=>{"GT"=>"12.91", "interval"=>"12", "GG"=>"0"}}, {"SZ002881"=>{"interval"=>"12", "GG"=>"0"}}, {"SZ300368"=>{"GT"=>"5", "LT"=>"6", "interval"=>"12", "GG"=>"0"}}, {"SZ300368"=>{"GT"=>"9", "LT"=>"7", "interval"=>"12", "GG"=>"0"}}, {"SZ300368"=>{"IR"=>"3.12", "DR"=>"2.18", "interval"=>"12", "GG"=>"0"}}, {"SH600004"=>{"IR"=>"0.20", "DR"=>"0.25", "interval"=>"12", "GG"=>"0"}}, {"SH600837"=>{"GT"=>"1", "LT"=>"16", "IR"=>"0.10", "DR"=>"1.05", "interval"=>"12", "GG"=>"0"}}, {"SH600876"=>{"IR"=>"2", "interval"=>"12", "GG"=>"0"}}, {"SH601519"=>{"GT"=>"9", "LT"=>"8", "IR"=>"3.13", "DR"=>"5.11", "interval"=>"0", "GG"=>"0"}}, {"SH603227"=>{"GT"=>"7", "LT"=>"6.9", "interval"=>"12", "GG"=>"0"}}, {"SH603227"=>{"GT"=>"6.92", "LT"=>"6.91", "interval"=>"12", "GG"=>"0"}}], "cid"=>"6a9d921606967559337ede0e64f3be93", "updatetime"=>"2017-12-26 15:45:36"}]}

关于缓存list,对list中的数据进行操作,如何更新缓存?

如: 缓存随意,假如我存放了一个list至缓存,list中有两个obj1,obj2对象。 我对obj1对象进行修改,删除obj2对象。 按照正常业务,缓存中的这个list也应该进行更新,但是我如何根据我的修改或者删除操作知道那个list中有我修改的数据? 最常见的应用:一个数据列表,在table上对某条数据进行了修改,就需要更新缓存了(这种还应该可以获取到对应数据的key,但是我是删除操作的话,就应该该分页数据缓存缓存后面所有数据页才对)后 类似的各种业务,你们是如何设计如何解决的?我之前见过一个,公司写了个定时任务去扫描该大类的所有缓存,找到即操作。。。蛋疼...

读取文本每隔三秒往redis中存入数据,定时器如何使用?

##### 现在做一个小demo,读取文本txt(文本是分行的),需求是读取到之后每隔三秒钟往redis中存储一条数据,我现在已经做了读取txt文本,并且输出为list集合,卡到这步了,想用定时器不知道怎么写,有没有大神们贴贴代码!!!!!

Redis和Memcache场景下效率对比

现在我做的是短信网关黑名单过滤机制,我每发一批短信,一批假如1000条, 这1000条数据都会从黑名单库中过一遍,目前我的黑名单是放在redis里, 由于长期的累积, 黑名单数量已经达到了几千万,现在每发一批短信过滤黑名单 的时间基本会耗时1秒到2秒,导致整个发送效率比较慢。对于这种场景下,redis和memcache或者其他缓存数据,更能节约时间提高过滤黑名单的效率。

redis怎样存储查询后的结果集?

一条查询语句,查询后MySQL数据库中的某一段数据,返回N条记录,存入到list中,应该如何将这个结果存到redis中呢?是选取sql语句作为redis的key吗?我是小白,不太懂redis ``` public List<Bean> selectAll() { return Dao.selectAll(); } ```

flask项目,从redis取值一直为None

我把生成的图片验证码按编号保存在redis中,然后按编号从redis中取值,但是返回一直为None,但是如果用redis_store.get("对应的id")就能取到值 ``` #coding:utf8 from . import api from ihome.utils.captcha.captcha import captcha from ihome import redis_store,constants,db from ihome.models import User from ihome.utils.response_code import RET from ihome.libs.yuntongxun.sms import CCP from flask import current_app,jsonify,make_response,request import random @api.route("/image_codes/<image_code_id>") def get_image_code(image_code_id): """ 获取图片验证码 :param image_code_id: 图片验证码编号 :return: 正常:验证码图片 异常:返回json """ # 业务逻辑处理 # 生成验证码图片 # 名字,真实文本, 图片数据 name,text,image_data=captcha.generate_captcha() # 将验证码真实值与编号保存到redis中, 设置有效期 # redis: 字符串 列表 哈希 set # "key": xxx # 使用哈希维护有效期的时候只能整体设置 # "image_codes": {"id1":"abc", "":"", "":""} 哈希 hset("image_codes", "id1", "abc") hget("image_codes", "id1") # 单条维护记录,选用字符串 # "image_code_编号1": "真实值" # "image_code_编号2": "真实值" # redis_store.set("image_code_%s"%image_code_id,text) # redis_store.expire("image_code_%s"%image_code_id,constants.IMAGE_CODE_REDIS_EXPIRES) # 记录名字              有效期               记录值           try: redis_store.setex("image_code_%s"%image_code_id,constants.IMAGE_CODE_REDIS_EXPIRES,text) except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DATAERR,errmsg="save msg id error") #返回图片 resp=make_response(image_data) resp.headers["Content-Type"]="image/jpg" return resp @api.route("/sms_codes/<re(r'1[34578]\d{9}'):mobile>") def get_sms_code(mobile): """获取短信验证码 """ #获取参数 image_code=request.args.get("image_code") image_code_id=request.args.get("image_code_id") #校验参数 if not all([image_code_id,image_code]): #表示参数不完整 return jsonify(errno=RET.PARAMERR,errmsg="incomplete parameter") #业务逻辑处理 #从redis中取出真实的图片验证码 try: real_image_code = redis_store.get("image_code_%s"%image_code_id) print real_image_code except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DBERR,errmsg="database error") #判断图片验证码是否过期 if real_image_code is None: return jsonify(errno=RET.NODATA,errmsg="image not exit or overdue") # 删除redis中的图片验证码,防止用户使用同一个图片验证码验证多次 try: redis_store.delete("image_code_%s" % image_code_id) except Exception as e: current_app.logger.error(e) #与用户填写的值进行对比 if real_image_code.lower() != image_code.lower(): return jsonify(errno=RET.DATAERR,errmsg="image error") # 判断对于这个手机号的操作,在60秒内有没有之前的记录,如果有,则认为用户操作频繁,不接受处理 try: send_flag = redis_store.get("send_sms_code_%s" % mobile) except Exception as e: current_app.logger.error(e) else: if send_flag is not None: # 表示在60秒内之前有过发送的记录 return jsonify(errno=RET.REQERR, errmsg=u"请求过于频繁,请60秒后重试") #判断手机号是否存在 try: user=User.query.filter_by(mobile=mobile).first() except Exception as e: current_app.logger.error(e) else: if user is not None: #表示手机号已经存在 return jsonify(errno=RET.DATAEXIST,errmsg="mobile is exist") #如果手机号不存在则生成短信验证码 sms_code="%06d"%random.randint(0,999999) #保存真实的短信验证码 try: redis_store.setex("sms_code_%s"%mobile,constants.MSG_CODE_REDIS_EXPIRES,sms_code) redis_store.setex("send_sms_code_%s"%mobile,constants.SEND_MSG_CODE_INTERNAL,1) except Exception as e: current_app.logger.error(e) jsonify(errno=RET.DBERR,errmsg="save code error") #发送短信 try: ccp=CCP() result=ccp.send_template_sms(mobile,[sms_code,int(constants.MSG_CODE_REDIS_EXPIRES/60)],1) except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.THIRDERR,errmsg="send abnormal") #返回值 if result==0: return jsonify(errno=RET.OK,errmsg="send success") else: return jsonify(errno=RET.SERVERERR,errmsg="send failed") ```

redis队列使用问题,求指导

client:负责往队列里写数据,写一条计数加一,当达到限制值,不往队列中写,但计数仍加1. server:负责处理队列数据,满足一定条件下,处理一条,队列删除一条,计数减一 队列:以某Id为key,处理时间为score。并且有多个队列同时存在。队列数据在数据库中唯一存在,不同队列的数据存在于不同表。 client不可能无限往redis写数据,得给队列设置一个限制值,超过限制就不放入缓存,待队列数据处理到一定量的时候,再从数据库中拉取点放入队列中。 问题:1.在没有一定硬件水平的情况下这样做是否合适?不合适的话该怎么做? 2.有多个队列的情况下,怎么拉取数据,涉及到多个表数据存放多个队列的问题。 3.求解啊?球大神指点。

spring boot整合redis获取异常或者获取不到

系统异常:org.springframework.data.redis.RedisConnec tionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool 刚启动系统运行正常,过几天就会出现这个异常,以下是关于redise的配置: # redis.properties文件中的内容如下: redis.hostName=127.0.0.1 redis.password= #端口号 redis.port=6379 #客户端超时时间单位是毫秒 默认是2000 redis.timeout=10000 #最大空闲数 redis.maxIdle=300 #连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal #redis.maxActive=600 #控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性 redis.maxTotal=300 #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。 redis.maxWaitMillis=1000 #连接的最小空闲时间 默认1800000毫秒(30分钟) redis.minEvictableIdleTimeMillis=300000 #每次释放连接的最大数目,默认3 redis.numTestsPerEvictionRun=1024 #逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1 redis.timeBetweenEvictionRunsMillis=30000 #是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个 redis.testOnBorrow=true #在空闲时检查有效性, 默认false redis.testWhileIdle=true # pom.xml中整合redis内容如下: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> # redisConfig内容如下: package com.brons.trans.redis; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import redis.clients.jedis.JedisPoolConfig; @Configuration @PropertySource("classpath:redis.properties") public class RedisConfig { Logger logger = LoggerFactory.getLogger(RedisConfig.class); @Value("${redis.hostName}") private String hostName; @Value("${redis.port}") private Integer port; @Value("${redis.password}") private String password; @Value("${redis.timeout}") private Integer timeout; @Value("${redis.maxIdle}") private Integer maxIdle; @Value("${redis.maxTotal}") private Integer maxTotal; @Value("${redis.maxWaitMillis}") private Integer maxWaitMillis; @Value("${redis.minEvictableIdleTimeMillis}") private Integer minEvictableIdleTimeMillis; @Value("${redis.numTestsPerEvictionRun}") private Integer numTestsPerEvictionRun; @Value("${redis.timeBetweenEvictionRunsMillis}") private long timeBetweenEvictionRunsMillis; @Value("${redis.testOnBorrow}") private boolean testOnBorrow; @Value("${redis.testWhileIdle}") private boolean testWhileIdle; // @Value("${spring.redis.cluster.nodes}") // private String clusterNodes; // // @Value("${spring.redis.cluster.max-redirects}") // private Integer mmaxRedirectsac; /** * JedisPoolConfig 连接池 * * @return */ @Bean public JedisPoolConfig jedisPoolConfig() { logger.info("初始化RedisConfig.JedisPoolConfig 连接池===="); JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); // 最大空闲数 jedisPoolConfig.setMaxIdle(maxIdle); // 连接池的最大数据库连接数 jedisPoolConfig.setMaxTotal(maxTotal); // 最大建立连接等待时间 jedisPoolConfig.setMaxWaitMillis(maxWaitMillis); // 逐出连接的最小空闲时间 默认1800000毫秒(30分钟) jedisPoolConfig.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); // 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3 jedisPoolConfig.setNumTestsPerEvictionRun(numTestsPerEvictionRun); // 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1 jedisPoolConfig.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); // 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个 jedisPoolConfig.setTestOnBorrow(testOnBorrow); // 在空闲时检查有效性, 默认false jedisPoolConfig.setTestWhileIdle(testWhileIdle); return jedisPoolConfig; } /** * 单机版配置 @Title: JedisConnectionFactory @param @param * jedisPoolConfig @param @return @return JedisConnectionFactory @autor * lpl @date 2018年2月24日 @throws */ @Bean public JedisConnectionFactory JedisConnectionFactory(JedisPoolConfig jedisPoolConfig) { logger.info("初始化RedisConfig.JedisConnectionFactory单机版配置===="); JedisConnectionFactory JedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig); // 连接池 JedisConnectionFactory.setPoolConfig(jedisPoolConfig); // IP地址 JedisConnectionFactory.setHostName(hostName); // 端口号 JedisConnectionFactory.setPort(port); // 如果Redis设置有密码 JedisConnectionFactory.setPassword(password); // 客户端超时时间单位是毫秒 JedisConnectionFactory.setTimeout(timeout); return JedisConnectionFactory; } /** * 实例化 RedisTemplate 对象 * * @return */ @Bean public RedisTemplate<String, Object> functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>(); initDomainRedisTemplate(redisTemplate, redisConnectionFactory); return redisTemplate; } /** * 设置数据存入 redis 的序列化方式,并开启事务 * * @param redisTemplate * @param factory */ private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) { // 如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to // String! redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); // 开启事务 redisTemplate.setEnableTransactionSupport(true); redisTemplate.setConnectionFactory(factory); } /** * 注入封装RedisTemplate @Title: redisUtil @return RedisUtil @autor lpl @date * 2017年12月21日 @throws */ @Bean(name = "redisUtil") public RedisUtil redisUtil(RedisTemplate<String, Object> redisTemplate) { RedisUtil redisUtil = new RedisUtil(); redisUtil.setRedisTemplate(redisTemplate); return redisUtil; } } # RedisUtil工具类文件内容如下: package com.brons.trans.redis; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.util.CollectionUtils; public class RedisUtil { private RedisTemplate<String, Object> redisTemplate; public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTemplate; } //=============================common============================ /** * 指定缓存失效时间 * @param key 键 * @param time 时间(秒) * @return */ public boolean expire(String key,long time){ try { if(time>0){ redisTemplate.expire(key, time, TimeUnit.SECONDS); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 根据key 获取过期时间 * @param key 键 不能为null * @return 时间(秒) 返回0代表为永久有效 */ public long getExpire(String key){ return redisTemplate.getExpire(key,TimeUnit.SECONDS); } /** * 判断key是否存在 * @param key 键 * @return true 存在 false不存在 */ public boolean hasKey(String key){ try { return redisTemplate.hasKey(key); } catch (Exception e) { e.printStackTrace(); return false; } } /** * 删除缓存 * @param key 可以传一个值 或多个 */ @SuppressWarnings("unchecked") public void del(String ... key){ if(key!=null&&key.length>0){ if(key.length==1){ redisTemplate.delete(key[0]); }else{ redisTemplate.delete(CollectionUtils.arrayToList(key)); } } } //============================String============================= /** * 普通缓存获取 * @param key 键 * @return 值 */ public Object get(String key){ return key==null?null:redisTemplate.opsForValue().get(key); } /** * 普通缓存放入 * @param key 键 * @param value 值 * @return true成功 false失败 */ public boolean set(String key,Object value) { try { redisTemplate.opsForValue().set(key, value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 普通缓存放入并设置时间 * @param key 键 * @param value 值 * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 * @return true成功 false 失败 */ public boolean set(String key,Object value,long time){ try { if(time>0){ redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); }else{ set(key, value); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 递增 * @param key 键 * @param by 要增加几(大于0) * @return */ public long incr(String key, long delta){ if(delta<0){ throw new RuntimeException("递增因子必须大于0"); } return redisTemplate.opsForValue().increment(key, delta); } /** * 递减 * @param key 键 * @param by 要减少几(小于0) * @return */ public long decr(String key, long delta){ if(delta<0){ throw new RuntimeException("递减因子必须大于0"); } return redisTemplate.opsForValue().increment(key, -delta); } //================================Map================================= /** * HashGet * @param key 键 不能为null * @param item 项 不能为null * @return 值 */ public Object hget(String key,String item){ return redisTemplate.opsForHash().get(key, item); } /** * 获取hashKey对应的所有键值 * @param key 键 * @return 对应的多个键值 */ public Map<Object,Object> hmget(String key){ return redisTemplate.opsForHash().entries(key); } /** * HashSet * @param key 键 * @param map 对应多个键值 * @return true 成功 false 失败 */ public boolean hmset(String key, Map<String,Object> map){ try { redisTemplate.opsForHash().putAll(key, map); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * HashSet 并设置时间 * @param key 键 * @param map 对应多个键值 * @param time 时间(秒) * @return true成功 false失败 */ public boolean hmset(String key, Map<String,Object> map, long time){ try { redisTemplate.opsForHash().putAll(key, map); if(time>0){ expire(key, time); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 向一张hash表中放入数据,如果不存在将创建 * @param key 键 * @param item 项 * @param value 值 * @return true 成功 false失败 */ public boolean hset(String key,String item,Object value) { try { redisTemplate.opsForHash().put(key, item, value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 向一张hash表中放入数据,如果不存在将创建 * @param key 键 * @param item 项 * @param value 值 * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 * @return true 成功 false失败 */ public boolean hset(String key,String item,Object value,long time) { try { redisTemplate.opsForHash().put(key, item, value); if(time>0){ expire(key, time); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 删除hash表中的值 * @param key 键 不能为null * @param item 项 可以使多个 不能为null */ public void hdel(String key, Object... item){ redisTemplate.opsForHash().delete(key,item); } /** * 判断hash表中是否有该项的值 * @param key 键 不能为null * @param item 项 不能为null * @return true 存在 false不存在 */ public boolean hHasKey(String key, String item){ return redisTemplate.opsForHash().hasKey(key, item); } /** * hash递增 如果不存在,就会创建一个 并把新增后的值返回 * @param key 键 * @param item 项 * @param by 要增加几(大于0) * @return */ public double hincr(String key, String item,double by){ return redisTemplate.opsForHash().increment(key, item, by); } /** * hash递减 * @param key 键 * @param item 项 * @param by 要减少记(小于0) * @return */ public double hdecr(String key, String item,double by){ return redisTemplate.opsForHash().increment(key, item,-by); } //============================set============================= /** * 根据key获取Set中的所有值 * @param key 键 * @return */ public Set<Object> sGet(String key){ try { return redisTemplate.opsForSet().members(key); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 根据value从一个set中查询,是否存在 * @param key 键 * @param value 值 * @return true 存在 false不存在 */ public boolean sHasKey(String key,Object value){ try { return redisTemplate.opsForSet().isMember(key, value); } catch (Exception e) { e.printStackTrace(); return false; } } /** * 将数据放入set缓存 * @param key 键 * @param values 值 可以是多个 * @return 成功个数 */ public long sSet(String key, Object...values) { try { return redisTemplate.opsForSet().add(key, values); } catch (Exception e) { e.printStackTrace(); return 0; } } /** * 将set数据放入缓存 * @param key 键 * @param time 时间(秒) * @param values 值 可以是多个 * @return 成功个数 */ public long sSetAndTime(String key,long time,Object...values) { try { Long count = redisTemplate.opsForSet().add(key, values); if(time>0) expire(key, time); return count; } catch (Exception e) { e.printStackTrace(); return 0; } } /** * 获取set缓存的长度 * @param key 键 * @return */ public long sGetSetSize(String key){ try { return redisTemplate.opsForSet().size(key); } catch (Exception e) { e.printStackTrace(); return 0; } } /** * 移除值为value的 * @param key 键 * @param values 值 可以是多个 * @return 移除的个数 */ public long setRemove(String key, Object ...values) { try { Long count = redisTemplate.opsForSet().remove(key, values); return count; } catch (Exception e) { e.printStackTrace(); return 0; } } //===============================list================================= /** * 获取list缓存的内容 * @param key 键 * @param start 开始 * @param end 结束 0 到 -1代表所有值 * @return */ public List<Object> lGet(String key,long start, long end){ try { return redisTemplate.opsForList().range(key, start, end); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 获取list缓存的长度 * @param key 键 * @return */ public long lGetListSize(String key){ try { return redisTemplate.opsForList().size(key); } catch (Exception e) { e.printStackTrace(); return 0; } } /** * 通过索引 获取list中的值 * @param key 键 * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 * @return */ public Object lGetIndex(String key,long index){ try { return redisTemplate.opsForList().index(key, index); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 将list放入缓存 * @param key 键 * @param value 值 * @param time 时间(秒) * @return */ public boolean lSet(String key, Object value) { try { redisTemplate.opsForList().rightPush(key, value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 将list放入缓存 * @param key 键 * @param value 值 * @param time 时间(秒) * @return */ public boolean lSet(String key, Object value, long time) { try { redisTemplate.opsForList().rightPush(key, value); if (time > 0) expire(key, time); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 将list放入缓存 * @param key 键 * @param value 值 * @param time 时间(秒) * @return */ public boolean lSet(String key, List<Object> value) { try { redisTemplate.opsForList().rightPushAll(key, value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 将list放入缓存 * @param key 键 * @param value 值 * @param time 时间(秒) * @return */ public boolean lSet(String key, List<Object> value, long time) { try { redisTemplate.opsForList().rightPushAll(key, value); if (time > 0) expire(key, time); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 根据索引修改list中的某条数据 * @param key 键 * @param index 索引 * @param value 值 * @return */ public boolean lUpdateIndex(String key, long index,Object value) { try { redisTemplate.opsForList().set(key, index, value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 移除N个值为value * @param key 键 * @param count 移除多少个 * @param value 值 * @return 移除的个数 */ public long lRemove(String key,long count,Object value) { try { Long remove = redisTemplate.opsForList().remove(key, count, value); return remove; } catch (Exception e) { e.printStackTrace(); return 0; } } }

Redis缓存一个List,可以存,但是取数据的时候失败,有大神知道怎么回事么?

public class RedisUtlis { //依赖注入jedis对象 // 存入数据到redis public static void saveJsonData(String key, List<Setmeal> values) throws Exception { JedisPool jedisPool = new JedisPool(); //获取jieis连接 Jedis jedis = jedisPool.getResource(); //判断key是否存在 // 把传入的对象转换成json字符串 String jsonData = JSON.toJSONString(values); //存入到redis jedis.set(RedisConst.SETMEAL_DATA_Setmeal,jsonData); //释放资源 jedis.close(); } // 获取缓存数据 public static List<Setmeal> getJsonData(String key) throws Exception{ JedisPool jedisPool = new JedisPool(); Jedis jedis = jedisPool.getResource(); String s = jedis.get(key); // 把字符串转换回集合对象 try { //把数据转换成数组 JSONArray jsonArray = JSON.parseArray(s); //数组转换成字符串 String js= JSONObject.toJSONString(jsonArray); //字符串转换成list List<Setmeal> setmeals = JSONObject.parseArray(js,Setmeal.class); return setmeals; }catch (Exception e){ e.printStackTrace(); jedis.close(); return null; } } }

java后台有定时器,定时更新数据,定时之后实时把更新数据返回到前台

java后台有定时器,定时更新数据,定时之后实时把更新数据返回到前台,应该怎么搞了?大神指点一下!!!

spring缓存@Cacheable@CachePut存入的数据是方法执行的返回值吗

比如我要修改一条数据 ``` @CachePut(value = "users",key = "1001") public void update(User user){ userDao.update(user); } ``` 为什么修改后存进去的数据是空的? @CachePut(value = "users",key = "1001") public User update(User user){ userDao.update(user); return user; } 只能这样才能存进去吗? 求解

关于spring boot部署后与本地数据库数据访问不一致的问题

spring boot 里写爬虫爬取数据。save函数思路如下:如果数据库里没有该记录就保存。 ```java if((gradeRepository.findByCourseName(grade.getCourseName()))==null){ gradeRepository.save(grade); //保存 }else{ continue; } ``` 问题:我在本地测试是没问题的,但在云服务器上部署了以后,数据会有两条缺失。 经过打印调试,发现那两条数据的if条件返回的结果是false.也就是一开始数据库里 没数据的情况下find返回的grade对象不为空……这就很奇怪了 环境说明:腾讯云Centos7.3, mysql5.6, spring boot 1.5.6RELEASE ![图片说明](https://img-ask.csdn.net/upload/201708/21/1503317039_361331.png) 请问该怎么办?谢谢!

java 数据拦截,分布式锁处理,请大神指点?

为了防止redis缓存穿透问题,系统采用了布隆过滤器,刚开始数据只有几百条 随着时间增长,数据已经过万了,可能后期数据还会快速增长,有可能达到亿 想请教一下大神,如果数据过亿还能使用布隆过滤器吗?或者说还有更好的解决方案? 分布式锁,redis的setnx实现一把分布式锁,通过while来阻塞等待得到锁,最近发现 系统遭受攻击,举例:1万个线程都在等待着,这样耗时比较大,或者说并发量比较大 很多请求都阻塞着,这样的请求该怎么处理啊 请知道的大神给一个思路,谢谢了

java开发安卓接口,token放缓存好还是数据库好呢?

java后台开发安卓接口,用户认证过产生的token放数据库好还是缓存好呢,过期时间设置多长合适呢 (存数据库,每次用户的查询操作都要查数据库,感觉速度慢影响数据库性能)

对于下面的类组成的树形结构,用什么方式编码(生成字符串存储)和解码(还原树形结构)比较好?

树形都在数据库中存储的有原始数据,每个节点只需要保存ID即可 [b]package com.eap.entity.report; import java.util.ArrayList; import java.util.List; public class Remark implements Comparable<Object> { // ID private int id; // 维度号 private int dimensionalityNo; // 该评语内容 private String content; // 是否有子节点标识 private int subNodeRelation; // 子节点列表 private List<Remark> subRemark; public String getContent() { return content; } public void setContent(String content) { this.content = content; } public int getDimensionalityNo() { return dimensionalityNo; } public void setDimensionalityNo(int dimensionalityNo) { this.dimensionalityNo = dimensionalityNo; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getSubNodeRelation() { return subNodeRelation; } public void setSubNodeRelation(int subNodeRelation) { this.subNodeRelation = subNodeRelation; } public List<Remark> getSubRemark() { if (subRemark == null) subRemark = new ArrayList<Remark>(); return subRemark; } public void setSubRemark(List<Remark> subRemark) { this.subRemark = subRemark; } public int compareTo(Object arg0) { // TODO Auto-generated method stub Remark r = (Remark) arg0; if (r.getId() > id) return 0; return 1; } }[/b] [b]问题补充:[/b] 每一个对象对应数据库中的一条数据,主键是ID,应用中生成了一个树形结构(每一个对象是一个节点,同时这个对象有对个子对象作为子节点),现在需要存储这个树形结构,也就是对这个树进行编码然后存储成一个字符串,当需要这个树形结构信息的时候,再通过编码生成的字符串构造树,然后通过每个节点的ID从数据库中获取内容 我的问题是:通过什么样的方法对树形结构进行编码效率最优化

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

Linux 会成为主流桌面操作系统吗?

整理 |屠敏出品 | CSDN(ID:CSDNnews)2020 年 1 月 14 日,微软正式停止了 Windows 7 系统的扩展支持,这意味着服役十年的 Windows 7,属于...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

学习总结之HTML5剑指前端(建议收藏,图文并茂)

前言学习《HTML5与CSS3权威指南》这本书很不错,学完之后我颇有感触,觉得web的世界开明了许多。这本书是需要有一定基础的web前端开发工程师。这本书主要学习HTML5和css3,看...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

搜狗输入法也在挑战国人的智商!

故事总是一个接着一个到来...上周写完《鲁大师已经彻底沦为一款垃圾流氓软件!》这篇文章之后,鲁大师的市场工作人员就找到了我,希望把这篇文章删除掉。经过一番沟通我先把这篇文章从公号中删除了...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

新一代神器STM32CubeMonitor介绍、下载、安装和使用教程

关注、星标公众号,不错过精彩内容作者:黄工公众号:strongerHuang最近ST官网悄悄新上线了一款比较强大的工具:STM32CubeMonitor V1.0.0。经过我研究和使用之...

记一次腾讯面试,我挂在了最熟悉不过的队列上……

腾讯后台面试,面试官问:如何自己实现队列?

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

冒泡排序动画(基于python pygame实现)

本项目效果初始截图如下 动画见本人b站投稿:https://www.bilibili.com/video/av95491382 本项目对应github地址:https://github.com/BigShuang python版本:3.6,pygame版本:1.9.3。(python版本一致应该就没什么问题) 样例gif如下 ======================= 大爽歌作,mad

Redis核心原理与应用实践

Redis核心原理与应用实践 在很多场景下都会使用Redis,但是到了深层次的时候就了解的不是那么深刻,以至于在面试的时候经常会遇到卡壳的现象,学习知识要做到系统和深入,不要把Redis想象的过于复杂,和Mysql一样,是个读取数据的软件。 有一个理解是Redis是key value缓存服务器,更多的优点在于对value的操作更加丰富。 安装 yum install redis #yum安装 b...

现代的 “Hello, World”,可不仅仅是几行代码而已

作者 |Charles R. Martin译者 | 弯月,责编 | 夕颜头图 |付费下载自视觉中国出品 | CSDN(ID:CSDNnews)新手...

带了6个月的徒弟当了面试官,而身为高级工程师的我天天修Bug......

即将毕业的应届毕业生一枚,现在只拿到了两家offer,但最近听到一些消息,其中一个offer,我这个组据说客户很少,很有可能整组被裁掉。 想问大家: 如果我刚入职这个组就被裁了怎么办呢? 大家都是什么时候知道自己要被裁了的? 面试软技能指导: BQ/Project/Resume 试听内容: 除了刷题,还有哪些技能是拿到offer不可或缺的要素 如何提升面试软实力:简历, 行为面试,沟通能...

!大部分程序员只会写3年代码

如果世界上都是这种不思进取的软件公司,那别说大部分程序员只会写 3 年代码,恐怕就没有程序员这种职业。

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

HTTP与HTTPS的区别

面试官问HTTP与HTTPS的区别,我这样回答让他竖起大拇指!

程序员毕业去大公司好还是小公司好?

虽然大公司并不是人人都能进,但我仍建议还未毕业的同学,尽力地通过校招向大公司挤,但凡挤进去,你这一生会容易很多。 大公司哪里好?没能进大公司怎么办?答案都在这里了,记得帮我点赞哦。 目录: 技术氛围 内部晋升与跳槽 啥也没学会,公司倒闭了? 不同的人脉圈,注定会有不同的结果 没能去大厂怎么办? 一、技术氛围 纵观整个程序员技术领域,哪个在行业有所名气的大牛,不是在大厂? 而且众所...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

程序员为什么千万不要瞎努力?

本文作者用对比非常鲜明的两个开发团队的故事,讲解了敏捷开发之道 —— 如果你的团队缺乏统一标准的环境,那么即使勤劳努力,不仅会极其耗时而且成果甚微,使用...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

立即提问
相关内容推荐