spring cache如何实现数据同步

比如我的代码有两个查询
一个是根据id查询,缓存时使用id作为key,
一个是查一个集合,缓存时使用查询条件作为key,
那么我在增删改操作时如何同步这个两个缓存中的数据?

5个回答

spring结合redis如何实现数据的缓存

1、实现目标

  通过redis缓存数据。(目的不是加快查询的速度,而是减少数据库的负担)  

2、所需jar包

 

  注意:jdies和commons-pool两个jar的版本是有对应关系的,注意引入jar包是要配对使用,否则将会报错。因为commons-pooljar的目录根据版本的变化,目录结构会变。前面的版本是org.apache.pool,而后面的版本是org.apache.pool2...

style="background-color: #0098dd; color: white; font-size: 17px; font-weight: bold;"3、redis简介

  redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)

3、编码实现

1)、配置的文件(properties)

  将那些经常要变化的参数配置成独立的propertis,方便以后的修改redis.properties

?
1
2
3
4
5
6
7
8
9
redis.hostName=127.0.0.1
redis.port=6379
redis.timeout=15000
redis.usePool=true

redis.maxIdle=6
redis.minEvictableIdleTimeMillis=300000
redis.numTestsPerEvictionRun=3
redis.timeBetweenEvictionRunsMillis=60000
2)、spring-redis.xml

  redis的相关参数配置设置。参数的值来自上面的properties文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName">

<!--


-->























3)、applicationContext.xml

  spring的总配置文件,在里面假如一下的代码

?
1
2
3
4
5
6
7
8
9
10
11
12




<value>classpath*:/META-INF/config/redis.properties</value>




4)、web.xml

  设置spring的总配置文件在项目启动时加载

?
1
2
3
4

contextConfigLocation
classpath*:/META-INF/applicationContext.xml<!-- -->

5)、redis缓存工具类

ValueOperations  ——基本数据类型和实体类的缓存
ListOperations   ——list的缓存
SetOperations   ——set的缓存

HashOperations  Map的缓存

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SetOperations;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

@Service
public class RedisCacheUtil
{

@Autowired @Qualifier("jedisTemplate")
public RedisTemplate redisTemplate;

/**

  • 缓存基本的对象,Integer、String、实体类等
  • @param key 缓存的键值
  • @param value 缓存的值
  • @return 缓存的对象
    */
    public ValueOperations setCacheObject(String key,T value)
    {

    ValueOperations operation = redisTemplate.opsForValue();
    operation.set(key,value);
    return operation;
    }

    /**

  • 获得缓存的基本对象。

  • @param key 缓存键值

  • @param operation

  • @return 缓存键值对应的数据
    /
    public T getCacheObject(String key/
    ,ValueOperations operation*/)
    {
    ValueOperations operation = redisTemplate.opsForValue();
    return operation.get(key);
    }

    /**

  • 缓存List数据

  • @param key 缓存的键值

  • @param dataList 待缓存的List数据

  • @return 缓存的对象
    */
    public ListOperations setCacheList(String key,List dataList)
    {
    ListOperations listOperation = redisTemplate.opsForList();
    if(null != dataList)
    {
    int size = dataList.size();
    for(int i = 0; i < size ; i ++)
    {

    listOperation.rightPush(key,dataList.get(i));
    }
    }

    return listOperation;
    }

    /**

  • 获得缓存的list对象

  • @param key 缓存的键值

  • @return 缓存键值对应的数据
    */
    public List getCacheList(String key)
    {
    List dataList = new ArrayList();
    ListOperations listOperation = redisTemplate.opsForList();
    Long size = listOperation.size(key);

    for(int i = 0 ; i < size ; i ++)
    {
    dataList.add((T) listOperation.leftPop(key));
    }

    return dataList;
    }

    /**

  • 缓存Set

  • @param key 缓存键值

  • @param dataSet 缓存的数据

  • @return 缓存数据的对象
    /
    public BoundSetOperations setCacheSet(String key,Set dataSet)
    {
    BoundSetOperations setOperation = redisTemplate.boundSetOps(key);
    /*T[] t = (T[]) dataSet.toArray();
    setOperation.add(t);
    /

    Iterator it = dataSet.iterator();
    while(it.hasNext())
    {
    setOperation.add(it.next());
    }

    return setOperation;
    }

    /**

  • 获得缓存的set

  • @param key

  • @param operation

  • @return
    /
    public Set getCacheSet(String key/
    ,BoundSetOperations operation*/)
    {
    Set dataSet = new HashSet();
    BoundSetOperations operation = redisTemplate.boundSetOps(key);

    Long size = operation.size();
    for(int i = 0 ; i < size ; i++)
    {
    dataSet.add(operation.pop());
    }
    return dataSet;
    }

    /**

  • 缓存Map

  • @param key

  • @param dataMap

  • @return
    */
    public HashOperations setCacheMap(String key,Map dataMap)
    {

    HashOperations hashOperations = redisTemplate.opsForHash();
    if(null != dataMap)
    {

    for (Map.Entry entry : dataMap.entrySet()) {

    /*System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); */
    hashOperations.put(key,entry.getKey(),entry.getValue());
    }

    }

    return hashOperations;
    }

    /**

  • 获得缓存的Map

  • @param key

  • @param hashOperation

  • @return
    /
    public Map getCacheMap(String key/
    ,HashOperations hashOperation*/)
    {
    Map map = redisTemplate.opsForHash().entries(key);
    /*Map map = hashOperation.entries(key);*/
    return map;
    }

    /**

  • 缓存Map

  • @param key

  • @param dataMap

  • @return
    */
    public HashOperations setCacheIntegerMap(String key,Map dataMap)
    {
    HashOperations hashOperations = redisTemplate.opsForHash();
    if(null != dataMap)
    {

    for (Map.Entry entry : dataMap.entrySet()) {

    /*System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); */
    hashOperations.put(key,entry.getKey(),entry.getValue());
    }

    }

    return hashOperations;
    }

    /**

  • 获得缓存的Map

  • @param key

  • @param hashOperation

  • @return
    /
    public Map getCacheIntegerMap(String key/
    ,HashOperations hashOperation*/)
    {
    Map map = redisTemplate.opsForHash().entries(key);
    /*Map map = hashOperation.entries(key);*/
    return map;
    }
    }
    6)、测试

  这里测试我是在项目启动的时候到数据库中查找出国家和城市的数据,进行缓存,之后将数据去除。

6.1 项目启动时缓存数据

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Service;

import com.test.model.City;
import com.test.model.Country;
import com.zcr.test.User;

/*

  • 监听器,用于项目启动的时候初始化信息
    */
    @Service
    public class StartAddCacheListener implements ApplicationListener
    {
    //日志
    private final Logger log= Logger.getLogger(StartAddCacheListener.class);

    @Autowired
    private RedisCacheUtil redisCache;

    @Autowired
    private BrandStoreService brandStoreService;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event)
    {
    //spring 启动的时候缓存城市和国家等信息
    if(event.getApplicationContext().getDisplayName().equals("Root WebApplicationContext"))
    {
    System.out.println("\n\n\n_________\n\n缓存数据 \n\n ________\n\n\n\n");
    List cityList = brandStoreService.selectAllCityMessage();
    List countryList = brandStoreService.selectAllCountryMessage();

    Map cityMap = new HashMap();

    Map countryMap = new HashMap();

    int cityListSize = cityList.size();
    int countryListSize = countryList.size();

    for(int i = 0 ; i < cityListSize ; i ++ )
    {
    cityMap.put(cityList.get(i).getCity_id(), cityList.get(i));
    }

    for(int i = 0 ; i < countryListSize ; i ++ )
    {
    countryMap.put(countryList.get(i).getCountry_id(), countryList.get(i));
    }

    redisCache.setCacheIntegerMap("cityMap", cityMap);
    redisCache.setCacheIntegerMap("countryMap", countryMap);
    }
    }

}
6.2 获取缓存数据

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Autowired
private RedisCacheUtil redisCache;

@RequestMapping("testGetCache")
public void testGetCache()
{
/*Map countryMap = redisCacheUtil1.getCacheMap("country");
Map cityMap = redisCacheUtil.getCacheMap("city");*/
Map countryMap = redisCacheUtil1.getCacheIntegerMap("countryMap");
Map cityMap = redisCacheUtil.getCacheIntegerMap("cityMap");

for(int key : countryMap.keySet())
{
System.out.println("key = " + key + ",value=" + countryMap.get(key));
}

System.out.println("------------city");
for(int key : cityMap.keySet())
{
System.out.println("key = " + key + ",value=" + cityMap.get(key));
}
}
由于Spring在配置文件中配置的bean默认是单例的,所以只需要通过Autowired注入,即可得到原先的缓存类。

以上就是spring+redis实现数据缓存的方法,希望对大家的学习有所帮助。

wild84
wild84 喵姐都是复制的,实际我是不理解原理,或者操作流程
大约 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
SpringCache下的缓存数据和数据库数据的同步问题!

![图片说明](https://img-ask.csdn.net/upload/201702/16/1487219524_34658.png) 这是我想实现的操作,哪位大神写过,springCache可以实现,序列图中的操作吗?

spring cache +redis与直接用redis有什么不同么?

spring cache 不也是缓存么,为什么不直接用redis呢,spring cache redis集成这样子有什么好处呢?

Spring Cache使用Redis缓存服务器,怎么指定KEY的有效期

请大神指点,Spring3.2.17版本框架,在使用Spring Cache的时候,怎么实现可自定义本次缓存KEY的有效期,因为业务不同,需要设置的有效期也不一样: @Cacheable(value="logCache",key="#root.methodName + #exceptionLogBean.logid") public ExceptionLogBean getLogInfo(ExceptionLogBean exceptionLogBean){ return exceptionLogService.selectLogByLogid(exceptionLogBean); }

SpringCache批量查询无法缓存,单个查询可以缓存。。。

![图片说明](https://img-ask.csdn.net/upload/201702/17/1487295111_154570.png) 谁遇到过这种情况

mongodb数据同步到MySQL

如何将mongodb数据同步到MySQL,有没有好的办法,可以同步增量

Spring boot 动态多数据源事物如果同步回滚

目前我使用了 https://blog.csdn.net/xiazai353503200/article/details/79390879 这里的配置方法 但是目前只能单数据源事物回滚,但是我有需求是需要多数据源同时操作,一个出错同步事物回滚。有没有什么好的解决方案?

spring动态加载数据源+动态添加数据源

相信很多开发者也遇到过这样的问题,随着项目的增大,使用的数据源会越来越多,现在比较流行配置数据源的方法是在xml配置文件配置数据源, ![图片说明](https://img-ask.csdn.net/upload/201611/24/1479978484_44310.png) 再继承类AbstractRoutingDataSource ![图片说明](https://img-ask.csdn.net/upload/201611/24/1479978496_990637.png) 这样做是挺麻烦的,每添加一个数据源,都要做重复的工作,而且好多代码都是重复的。 现在小弟的做法是,把xml的配置转到用java代码装配,数据源参数从数据库获取,按xml配置文件的意思,只要给AbstractRoutingDataSource里的targetDataSources(数据源集合)和defaultTargetDataSource(默认数据源)初始化就好。 具体代码如下: ![图片说明](https://img-ask.csdn.net/upload/201611/24/1479978510_435106.png) ![图片说明](https://img-ask.csdn.net/upload/201611/24/1479978527_153617.png) ![图片说明](https://img-ask.csdn.net/upload/201611/24/1479978540_741057.png) 至此完成从xml配置文件到java代码装配,启动没有问题。使用默认数据源的用户登录系统没有问题,但当使用非默认数据源用户登录系统时,会提示找不到用户,难道加载数据源出问题?只成功加载了默认数据源?但是断点跟踪,数据源集合targetDataSources是有值的。使用其他数据源的用户登录时,下面这个方法也是有返回值的: ![图片说明](https://img-ask.csdn.net/upload/201611/24/1479978551_385665.png) 百思不得其解!有做过这方面的大神可以给点建议吗? 还有一个问题,数据源集合是在系统启动时加载的,如果我在数据库添加多一个数据源,那又怎样可以不用重启系统就可以直接访问这个数据源对应的数据库呢? 在此先谢了! 2016-11-29更新解决办法 动态切换数据源解决办法:原来的配置文件里的数据源集合的key用的是DataSourceType,而我手动装配数据源用的是 ![图片说明](https://img-ask.csdn.net/upload/201611/29/1480429699_315678.png) 装配数据源地方的代码修改如下: ![图片说明](https://img-ask.csdn.net/upload/201611/30/1480467096_241144.jpg) 改后可以自由切换数据源。现在剩下动态添加数据源没有实现。 DataSourceType类型是一个枚举类型。 动态加载数据源关键一点:在系统运行时加载多一个数据源,加载此数据源的对象必须和系统启动时加载数据源的同一个,在我这里加载数据源的对象是类DynamicDataSource,可在这里添加一个加载数据源的方法: ![图片说明](https://img-ask.csdn.net/upload/201701/11/1484099363_286931.jpg) 至于如何得到同一个是类DynamicDataSource,可以在系统启动时在某个地方保存一份此对象,就像保存数据源一样,当需要使用数据源时可以获取。

Spring RedisCacheManager 用java代码获取缓存

``` <bean id="redisCacheManager" class="org.springframework.data.redis.cache.RedisCacheManager"> <constructor-arg name="redisOperations" ref="redisTemplate" /> </bean> ``` 我配置了Redis作为缓存,集成在Spring中,目前的做法是直接在需要缓存的方法名上加@Cacheable(value = "xxx")实现缓存。 但我还有另外一个需求,就是在redis中存放登陆的用户。那这样在方法名上增加注解实现不了。需要直接用java代码添加及获取缓存。 我看了下RedisCacheManager的数据结构,但还是分析不出来怎么做。

Spring Security与Spring Session集成实现Session共享的问题

项目使用Spring Boot,Spring Security,已经成功集成Spring Session与redis,现在有两个问题 1.为什么每次访问系统登录页,SpringSession都会在redis里面存一个session呢? 2.Spring Security中的Session管理怎么与SpringSession结合到一起?SpringSecurity的Session管理貌似是存在内存的,SpringSession放在redis,二者联系不到。比如清空了Redis,那项目的内存中还是存在Session,怎么实现关联... 菜鸟只能想到实现SessionRegistry接口了... 有没有大神或者做过相关的大神指教一下,讨论一下(*^__^*)

怎么实现spring Security实现集群间共享session???

spring security中,怎么把共享的session存入到redis中去? protected void configure(HttpSecurity http) throws Exception { http .sessionManagement() .maximumSessions(32) .sessionRegistry(sessionRegistry); 这里面会话注册表sessionRegistry是怎样与redis关联的呢?请指教,多谢了

关于java从数据接口获取数据与本地数据库进行同步的问题

近期项目需求使用app数据接口,进行登录,查询(不能直接操作app数据库),获得用户信息,考虑到用户信息有很多的关联关系,我将查到的数据放入的数据库中,但是app如果有新用户加入,我这边也要进行更新,同步问题怎么解决? 现在我的思路是: 使用spring quartz定时调度,如果app数据比这边多,我这边插入,比这边少,查到id,移除数据,但是如果双方数据量相同,就是有用户注册,也有用户销户使双方数据量相同,这时怎么解决?

JAVA异步方法如何转同步

两个spring-boot websocket项目,两个以websocket传输数据。问题是,我在一个项目的某处使用standardwebsocketclient创建连接请求数据,在handler中接收返回数据。这样的异步,我在调用处如何获取返回的信息呢?急求解决方案,大家帮帮忙!

spring cloud config 如何动态更新数据源?

spring cloud config 怎样才能动态的更新数据库得到数据源呢?

spring task 实现实现定时任务:动态暂停 恢复 修改和删除任务

以前是用spring+quartz的方式实现的定时任务:动态暂停 恢复 修改和删除任务。 但是在spring3以后,spring自己的task包,能实现轻量级的定时任务。 项目决定不用quartz,只用spring自带的包,完成这个任务。 我搜索了资料,发现很少有这方面的资料。求叫大神们,只用spring怎么实现以上要求。

Spring+Ehcache怎么缓存List集合?

Spring+Ehcache怎么实现缓存List集合?。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

spring+hibernate配置多数据源动态切换,java实体如何和各个数据库实例映射?

我的一个javaweb项目,需要用到多个数据源,都是oracle实例,我用spring配置了数据源的动态切换。使用AOP在service层做拦截,然后用注解DataSource来标示所要选择的数据源。现在我有一个问题,就是我用数据库操作时,hibernate是面向对象的,我该如何将不同的java实体映射到不同的数据源上(不同数据库表结构不同)。比如一个product包中的java实体映射到数据库1,cart包中的实体映射到数据库2。如何做到呢?

Spring Boot 使用Redis缓存 配置问题

# 背景 我想要在当前的Spring Boot项目中使用Redis作为缓存。目前所了解到的内容是Redis缓存有两种实现方式,一种是使用Spring Cache注解,需要加一个配置文件,另一种是使用RedisTemplate,想要两种方式混合使用。 # 相关版本 Spring Boot:Spring Boot 2.0.0.M7 Redis依赖包: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` # 主要问题: application中yml文件我按照书上和官方文档的推荐方式在Application.yml里面做了如下配置,因为我使用的Spring Boot版本比较新,因为配置方式与之前的稍微有点不一样: ``` spring: redis: host: 127.0.0.1 port: 6379 password: 123456 #timeout: 0 #Spring Boot 2.0.0.M7中原有的redis配置方法过时,加了一层jedis jedis: pool: max-active: 8 max-wait: -1 min-idle: 8 max-idle: 0 ``` 而为了使用Spring Cache注解,需要启用注解并且设置数据在Redis数据库的有效期限,需要如下配置: ![图片说明](https://img-ask.csdn.net/upload/201802/22/1519271575_371074.png) 无论是我看的书籍还是查阅的很多博客都是这种配置方式,但是如图报错了。我猜想很大可能是版本原因,因此去查看了Spring提供的官方文档(2.0.0.M1的文档,是最新的文档): https://docs.spring.io/spring-data/redis/docs/2.1.0.M1/api/ 里面的RedisCacheManager的构造方法显然没有上面图片中的那种,文档所提供的的构造方法我有看不太懂应该怎么获取或者使用。 因为第一次配置我了解的相关知识也比较少,希望有大神能够指导一下在这里具体应该怎么配置Redis数据的过期时间? 感谢阅读问题~

关于spring动态加载数据源切换不成功问题,请大家指导!!!

最近在做一个项目框架选用springMVC + spring + spring-data-jpa,需求要分库查询数据,按照网上的思路,利用spring的AOP编写了动态数据源加载代码。但是在运行程序时发现,一个controller方法内调用两个service查询方法,只能执行一次数据源切换,第一个方法数据源切换后,第二个查询方法不进入DynamicDataSource这个类,导致数据源没有切换回来!下面是我的代码!请大家有经验的传授一下,谢谢! ![controller层](https://img-ask.csdn.net/upload/201704/18/1492528337_771588.png) ![自定义切面](https://img-ask.csdn.net/upload/201704/18/1492528457_720147.png) ![图片说明](https://img-ask.csdn.net/upload/201704/18/1492528495_909510.png) ![动态数据源类](https://img-ask.csdn.net/upload/201704/18/1492528509_191034.png) ![applicationContext配置文件](https://img-ask.csdn.net/upload/201704/18/1492528529_387481.png) ![applicationContext配置文件](https://img-ask.csdn.net/upload/201704/18/1492528559_977561.png) ![applicationContext配置文件](https://img-ask.csdn.net/upload/201704/18/1492528585_334955.png) ![applicationContext配置文件](https://img-ask.csdn.net/upload/201704/18/1492528604_907506.png) ![applicationContext配置文件](https://img-ask.csdn.net/upload/201704/18/1492528626_569291.png)

Spring是怎么根据接口获取实现类的?

动态代理 不是要知道实现类和接口才能创建出代理对象吗? 引用Autowired注解注入service时都是写的接口,spring是怎么找到接口的实现类的? 是扫包时记录了依赖关系还是什么别的方法?

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

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

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

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

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

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

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

你以为这样写Java代码很6,但我看不懂

为了提高 Java 编程的技艺,我最近在 GitHub 上学习一些高手编写的代码。下面这一行代码(出自大牛之手)据说可以征服你的朋友,让他们觉得你写的代码很 6,来欣赏一下吧。 IntStream.range(1, 5).boxed().map(i -&gt; { System.out.print("Happy Birthday "); if (i == 3) return "dear NAME"...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

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

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

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

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

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

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

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

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

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

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

程序员写出这样的代码,能不挨骂吗?

当你换槽填坑时,面对一个新的环境。能够快速熟练,上手实现业务需求是关键。但是,哪些因素会影响你快速上手呢?是原有代码写的不够好?还是注释写的不够好?昨夜...

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

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

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

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

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

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

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

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

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

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

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

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

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

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

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

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

Python爬虫,高清美图我全都要(彼岸桌面壁纸)

爬取彼岸桌面网站较为简单,用到了requests、lxml、Beautiful Soup4

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

Java岗开发3年,公司临时抽查算法,离职后这几题我记一辈子

前几天我们公司做了一件蠢事,非常非常愚蠢的事情。我原以为从学校出来之后,除了找工作有测试外,不会有任何与考试有关的事儿。 但是,天有不测风云,公司技术总监、人事总监两位大佬突然降临到我们事业线,叫上我老大,给我们组织了一场别开生面的“考试”。 那是一个风和日丽的下午,我翘着二郎腿,左手端着一杯卡布奇诺,右手抓着我的罗技鼠标,滚动着轮轴,穿梭在头条热点之间。 “淡黄的长裙~蓬松的头发...

大牛都会用的IDEA调试技巧!!!

导读 前天面试了一个985高校的实习生,问了他平时用什么开发工具,他想也没想的说IDEA,于是我抛砖引玉的问了一下IDEA的调试用过吧,你说说怎么设置断点...

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

立即提问
相关内容推荐