public class StringRedisTemplate extends RedisTemplate {
/**
* Constructs a new StringRedisTemplate instance. {@link #setConnectionFactory(RedisConnectionFactory)}
* and {@link #afterPropertiesSet()} still need to be called.
*/
public StringRedisTemplate() {
RedisSerializer stringSerializer = new StringRedisSerializer();
setKeySerializer(stringSerializer);
setValueSerializer(stringSerializer);
setHashKeySerializer(stringSerializer);
setHashValueSerializer(stringSerializer);
}
2 RedisTemplate中redis操作是通过RedisConnection实现
public void delete(K key) {
final byte[] rawKey = rawKey(key);
execute(new RedisCallback
3 RedisConnection继承RedisCommands
public interface RedisConnection extends RedisCommands {
.........
}
4 RedisCommands继承所有命令,拥有所有的redis操作命令
public interface RedisCommands extends RedisKeyCommands, RedisStringCommands, RedisListCommands, RedisSetCommands,
RedisZSetCommands, RedisHashCommands, RedisTxCommands, RedisPubSubCommands, RedisConnectionCommands,
RedisServerCommands, RedisScriptingCommands, RedisGeoCommands, HyperLogLogCommands {
/**
* 'Native' or 'raw' execution of the given command along-side the given arguments. The command is executed as is,
* with as little 'interpretation' as possible - it is up to the caller to take care of any processing of arguments or
* the result.
*
* @param command Command to execute
* @param args Possible command arguments (may be null)
* @return execution result.
*/
Object execute(String command, byte[]... args);
}
那么只要拥有RedisConnection就能执行redis客户端的所有命令。
5 编写RedisServiceExtend
/**
* @Title: RedisServiceExtend
* @Description: redis 扩展
* @author chy
* @date 2018/5/8 8:27
*/
@Repository
public class RedisServiceExtend {
private static String redisCode = "utf-8";
@Autowired
RedisTemplate redisTemplate;
public RedisTemplate getRedisTemplate() {
return redisTemplate;
}
public void setRedisTemplate(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
/**
* 统计bit位为1的总数
* @param key
*/
public long bitCount(final String key) {
return redisTemplate.execute(new RedisCallback() {
@Override
public Long doInRedis(RedisConnection connection) throws DataAccessException {
long result = 0;
result = connection.bitCount(key.getBytes());
return result;
}
});
}
/**
* 批处理命令
* @param callback
* @return
*/
public List multi(RedisCallback> callback) {
return redisTemplate.execute(callback);
}
}
5 编写测试用例
/**
* @Title: DemoRedisTransactionTest
* @Description: redis 事物测试
* @author chy
* @date 2018/8/1 14:46
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoRedisTransactionTest {
@Autowired
RedisServiceExtend redisServiceExtend;
/**
* 测试 事物
* @return
*/
@Test
public void multi() {
List objects = redisServiceExtend.multi(new RedisCallback>() {
@Override
public List doInRedis(RedisConnection connection) throws DataAccessException {
connection.multi();
connection.set("trans1".getBytes(), "事物1".getBytes());
connection.set("trans2".getBytes(), "trans2".getBytes());
connection.mGet("trans1".getBytes(), "trans2".getBytes());
List list = connection.exec();
return list;
}
});
List data = (ArrayList) objects.get(0);
List rData = data.stream()
.map(x -> {
byte[] t = (byte[]) x;
System.out.println("数据------>" + new String(t));
return new String(t);
}).collect(Collectors.toList());
rData.forEach(System.out::println);
}
/**
* 事务只能在所有被监视键都没有被修改的前提下执行,
* 如果这个前提不能满足的话,事务就不会被执行。
*/
@Test
public void watch() {
List objects = redisServiceExtend.multi(new RedisCallback>() {
@Override
public List doInRedis(RedisConnection connection) throws DataAccessException {
List list = null;
do {
//观察key
connection.watch("mykey".getBytes());
connection.multi();
//自增
connection.incrBy("mykey".getBytes(), 1);
connection.incrBy("mykey".getBytes(), 1);
//如果事物执行期间mykey的值没有被修改则执行成功,否则执行失败
list = connection.exec();
//如果执行失败 list.size()==0
}
//失败重试,直到执行成功
while (list == null || list.size() == 0);
return list;
}
});
if(objects.size()>0) {
System.out.println("mykey-------->" + (long) objects.get(0));
}
if(objects.size()>1) {
System.out.println("mykey-------->" + (long) objects.get(1));
}
}
}
Task not serializable是Spark开发过程最令人头疼的问题之一,这里记录下出现这个问题的两个实例,一个是自己遇到的,另一个是stackoverflow上看到。等有时间了再仔细探究出现Task not serialiazable的各种原因以及出现问题后如何快速定位问题的所在,至少目前阶段碰到此类问题,没有什么章法
1.
package spark.exampl
mysql 查看当前正在执行的操作,即正在执行的sql语句的方法为:
show processlist 命令
mysql> show global status;可以列出MySQL服务器运行各种状态值,我个人较喜欢的用法是show status like '查询值%';一、慢查询mysql> show variab
1. 只有Map任务的Map Reduce Job
File System Counters
FILE: Number of bytes read=3629530
FILE: Number of bytes written=98312
FILE: Number of read operations=0
FILE: Number of lar
import java.util.LinkedList;
import java.util.List;
import ljn.help.*;
public class BTreeLowestParentOfTwoNodes {
public static void main(String[] args) {
/*
* node data is stored in
本文介绍Java API 中 Date, Calendar, TimeZone和DateFormat的使用,以及不同时区时间相互转化的方法和原理。
问题描述:
向处于不同时区的服务器发请求时需要考虑时区转换的问题。譬如,服务器位于东八区(北京时间,GMT+8:00),而身处东四区的用户想要查询当天的销售记录。则需把东四区的“今天”这个时间范围转换为服务器所在时区的时间范围。
入口脚本
入口脚本是应用启动流程中的第一环,一个应用(不管是网页应用还是控制台应用)只有一个入口脚本。终端用户的请求通过入口脚本实例化应用并将将请求转发到应用。
Web 应用的入口脚本必须放在终端用户能够访问的目录下,通常命名为 index.php,也可以使用 Web 服务器能定位到的其他名称。
控制台应用的入口脚本一般在应用根目录下命名为 yii(后缀为.php),该文