RedisConfig

@Configuration
public class RedisConfig {
//编写redisTemplate
//固定模板,开箱即用
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
//为了开发方便一般使用string,object
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
//json序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); 部分版本因为漏洞或者其他原因弃用
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
//String的序列化
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//key采用的string序列化方式
template.setKeySerializer(stringRedisSerializer);
//hash的key也采用string的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
//value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
//hash的value采用jackson序列化
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}

RedisUtil

@Component
public class RedisUtil {
@Autowired
RedisTemplate<String, Object> redisTemplate;
/**-----------------------------key相关操作-------------------------------------*/
/**
* @Description: 是否存在key
* @Param: [key]
* @return: boolean
* @Author: MiZiMi
* @Date: 2020/4/28 17:10
*/
public boolean hasKey(String key) {
return key == null ? false : redisTemplate.hasKey(key);
} /**
* @Description: 删除key
* @Param: [key]
* @return: boolean
* @Author: MiZiMi
* @Date: 2020/4/28 17:10
*/
public boolean delete(String key) {
return key == null ? false : redisTemplate.delete(key);
} /**
* @Description: 批量删除key
* @Param: [keys]
* @return: java.lang.Long
* @Author: MiZiMi
* @Date: 2020/4/28 17:12
*/
public Long delete(Collection<String> keys) {
return redisTemplate.delete(keys);
} /**
* @Description: 设置过期时间
* @Param: [key, timeout, unit]
* @return: java.lang.Boolean
* @Author: MiZiMi
* @Date: 2020/4/28 17:15
*/
public Boolean expire(String key, long timeout, TimeUnit unit) {
if (key == null || unit == null) {
return false;
}
return redisTemplate.expire(key, timeout, unit);
} /**
* @Description: 查找匹配的key
* @Param: [pattern]
* @return: java.util.Set<java.lang.String>
* @Author: MiZiMi
* @Date: 2020/4/28 17:16
*/
public Set<String> keys(String pattern) {
if (pattern == null) {
return null;
}
return redisTemplate.keys(pattern);
} /**
* @Description: 移除key的过期时间,key将持久保持
* @Param: [key]
* @return: java.lang.Boolean
* @Author: MiZiMi
* @Date: 2020/4/28 17:18
*/
public Boolean persist(String key) {
if (key == null) {
return false;
}
return redisTemplate.persist(key);
} /**
* @Description: 查看key的过期时间, key或者unit不存在时返回0,key存在但是没有设置生存时间,返回-1,key不存在返回-2
* @Param: [key, unit]
* @return: java.lang.Long
* @Author: MiZiMi
* @Date: 2020/4/28 17:20
*/
public Long getExpire(String key, TimeUnit unit) {
if (key == null || unit == null) {
throw new IllegalArgumentException("getExpire 参数不能为null");
}
return redisTemplate.getExpire(key, unit);
}
/**-----------------------------String相关操作-------------------------------------*/
/**
* @Description: 设置key-value
* @Param: [key, value]
* @return: void
* @Author: MiZiMi
* @Date: 2020/4/28 17:23
*/
public void set(String key, Object value) {
if (key == null || value == null) {
return;
}
redisTemplate.opsForValue().set(key, value);
} /**
* @Description: 设置key value并设置过期时间
* @Param: [key, value, Time, unit]
* @return: void
* @Author: MiZiMi
* @Date: 2020/4/28 17:26
*/
public void set(String key, Object value, long Time, TimeUnit unit) {
if (key == null || value == null || unit == null) {
return;
}
redisTemplate.opsForValue().set(key, value, Time, unit);
} /**
* @Description: 设置key-value并设置过期时间,有返回值
* @Param: [key, value, Time, unit]
* @return: java.lang.Boolean
* @Author: MiZiMi
* @Date: 2020/4/28 17:31
*/
public Boolean setIfAbsent(String key, Object value, long Time, TimeUnit unit) {
if (key == null || value == null || unit == null) {
throw new IllegalArgumentException("setIfAbsent 参数不能为null");
}
return redisTemplate.opsForValue().setIfAbsent(key, value, Time, unit);
} /**
* @Description: 获取指定key的值
* @Param: [key]
* @return: java.lang.Object
* @Author: MiZiMi
* @Date: 2020/4/28 17:34
*/
public Object get(String key) {
if (key == null) {
return null;
}
return redisTemplate.opsForValue().get(key);
} /**
* @Description: 先获取,再设置
* @Param: [key, value]
* @return: java.lang.Object
* @Author: MiZiMi
* @Date: 2020/4/28 17:36
*/
public Object getSet(String key, Object value) {
if (key == null) {
return null;
}
return redisTemplate.opsForValue().getAndSet(key, value);
} /**
* @Description: 批量key获取批量value
* @Param: [keys]
* @return: java.util.List<java.lang.Object>
* @Author: MiZiMi
* @Date: 2020/4/28 17:38
*/
public List<Object> mget(Collection<String> keys) {
if (keys == null) {
return Collections.emptyList();
}
return redisTemplate.opsForValue().multiGet(keys);
} /**
* @Description: 将指定Key的Value原子性的增加increment。如果该Key不存在,其初始值为0,
* 在incrby之后其值为increment。如果Value的值不能转换为整型值,如Hi,
* 该操作将执行失败并抛出相应异常。操作成功则返回增加后的value值
* @Param: [key, increment]
* @return: long
* @Author: MiZiMi
* @Date: 2020/4/28 17:43
*/
public Long incrby(String key, long increment) {
if (key == null) {
throw new IllegalArgumentException("incrby 参数 key 不能为null");
}
return redisTemplate.opsForValue().increment(key, increment);
} /**
* @Description: 将指定key的value原子性的减少decrement, 如果key不存在,其初始冷0,
* 在decrby之后其值decrement,如果value的值不能转换为整数值,如果执行失败就抛出异常,操作成功后返回减少后的值
* @Param: [key, decrement]
* @return: java.lang.Long
* @Author: MiZiMi
* @Date: 2020/4/28 17:46
*/
public Long decrby(String key, long decrement) {
if (key == null) {
throw new IllegalArgumentException("decrby 参数 key 不能为null");
}
return redisTemplate.opsForValue().decrement(key, decrement);
} /**
* @Description: 如果key存在,append命令将参数value的数据追加到已存在value的末尾,
* 如果key不存在,append命令就会创建一个新的 key/value,返回追加后的value的字符串长度
* @Param: [key, value]
* @return: java.lang.Integer
* @Author: MiZiMi
* @Date: 2020/4/28 17:50
*/
public Integer append(String key, String value) {
if (key == null) {
throw new IllegalArgumentException("append 参数 key 不能为null");
}
return redisTemplate.opsForValue().append(key, value);
}
/**-----------------------------hash相关操作-------------------------------------*/
/**
* @Description: 通过key和field获取指定的value
* @Param: [key, field]
* @return: java.lang.Object
* @Author: MiZiMi
* @Date: 2020/4/28 17:52
*/
public Object hGet(String key, Object field) {
if (key == null || field == null) {
return null;
}
return redisTemplate.opsForHash().get(key, field);
} /**
* @Description: 设置key field value
* @Param: [key, field, value]
* @return: void
* @Author: MiZiMi
* @Date: 2020/4/28 17:54
*/
public void hSet(String key, Object field, Object value) {
if (key == null || field == null) {
return;
}
redisTemplate.opsForHash().put(key, field, value);
} /**
* @Description: 判断指定的key中是否存在指定的field
* @Param: [key, field]
* @return: java.lang.Boolean
* @Author: MiZiMi
* @Date: 2020/4/28 17:55
*/
public Boolean hExists(String key, Object field) {
if (key == null || field == null) {
return false;
}
return redisTemplate.opsForHash().hasKey(key, field);
} /**
* @Description: 删除指定key中的多个字段
* @Param: [key, fields]
* @return: java.lang.Long
* @Author: MiZiMi
* @Date: 2020/4/28 17:57
*/
public Long hDel(String key, Object... fields) {
if (key == null || fields == null || fields.length == 0) {
return 0L;
}
return redisTemplate.opsForHash().delete(key, fields);
} /**
* @Description: 通过指定的key获取所有的field和value
* @Param: [key]
* @return: java.util.Map<java.lang.Object, java.lang.Object>
* @Author: MiZiMi
* @Date: 2020/4/28 17:59
*/
public Map<Object, Object> hgetAll(String key) {
if (key == null) {
return null;
}
return redisTemplate.opsForHash().entries(key);
} /**
* @Description: 批量设置hash的field/value
* @Param: [key, hash]
* @return: void
* @Author: MiZiMi
* @Date: 2020/4/28 18:01
*/
public void hmSet(String key, Map<String, Object> hash) {
if (key == null || hash == null) {
return;
}
redisTemplate.opsForHash().putAll(key, hash);
} /**
* @Description: 获取指定key中的一组filed的一组value的值
* @Param: [key, fields]
* @return: java.util.List<java.lang.Object>
* @Author: MiZiMi
* @Date: 2020/4/28 18:04
*/
public List<Object> hmGet(String key, Collection<Object> fields) {
if (key == null || fields == null) {
return null;
}
return redisTemplate.opsForHash().multiGet(key, fields);
} /**
* @Description: 对应key的字段自增相应的值
* @Param: [key, field, increment]
* @return: java.lang.Long
* @Author: MiZiMi
* @Date: 2020/4/28 18:06
*/
public Long hIncrby(String key, Object field, long increment) {
if (key == null || field == null) {
throw new IllegalArgumentException("hIncrby key or field 不能为空");
}
return redisTemplate.opsForHash().increment(key, field, increment);
}
/**-----------------------------List相关操作-------------------------------------*/
/**
* @Description: 向列表左边添加元素。如果该Key不存在,该命令将在插入之前创建一个与该Key关联的空链表,
* 之后再将数据从链表的头部插入。
* 如果该键的Value不是链表类型,该命令将将会抛出相关异常。操作成功则返回插入后链表中元素的数量
* @Param: [key, strs]
* @return: java.lang.Long
* @Author: MiZiMi
* @Date: 2020/4/28 18:09
*/
public Long lPush(String key, Object... strs) {
if (key == null) {
return 0L;
}
return redisTemplate.opsForList().leftPushAll(key, strs);
} /**
* @Description: 向列表右边添加元素。如果该Key不存在,该命令将在插入之前创建一个与该Key关联的空链表,
* 之后再将数据从链表的头部插入。
* 如果该键的Value不是链表类型,该命令将将会抛出相关异常。操作成功则返回插入后链表中元素的数量
* @Param: [key, strs]
* @return: java.lang.Long
* @Author: MiZiMi
* @Date: 2020/4/28 18:11
*/
public Long rPush(String key, Object... strs) {
if (key == null) {
return 0L;
}
return redisTemplate.opsForList().rightPushAll(key, strs);
} /**
* @Description: 从左边弹出指定key的value
* @Param: [key]
* @return: java.lang.Object
* @Author: MiZiMi
* @Date: 2020/4/28 18:12
*/
public Object lPop(String key) {
if (key == null) {
return null;
}
return redisTemplate.opsForList().leftPop(key);
} /**
* @Description: 从右边弹出指定key的value
* @Param: [key]
* @return: java.lang.Object
* @Author: MiZiMi
* @Date: 2020/4/28 18:12
*/
public Object rPop(String key) {
if (key == null) {
return null;
}
return redisTemplate.opsForList().rightPop(key);
} /**
* @Description:取返回
* @Param: [key, start, end]
* @return: java.util.List<java.lang.Object>
* @Author: MiZiMi
* @Date: 2020/4/28 18:16
*/
public List<Object> lRange(String key, long start, long end) {
if (key == null) {
return null;
}
return redisTemplate.opsForList().range(key, start, end);
} /**
* @Description: 让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
* 下标 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
* 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推
* @Param: [key, start, end]
* @return: void
* @Author: MiZiMi
* @Date: 2020/4/28 18:19
*/
public void lTrim(String key, long start, long end) {
if (key == null) {
return;
}
redisTemplate.opsForList().trim(key, start, end);
} /**
* @Description: 该命令将返回链表中指定位置(index)的元素,index是0-based,表示从头部位置开始第index的元素,
* 如果index为-1,表示尾部元素。如果与该Key关联的不是链表,该命令将返回相关的错误信息。 如果超出index返回这返回nil
* @Param: [key, index]
* @return: java.lang.Object
* @Author: MiZiMi
* @Date: 2020/4/28 18:20
*/
public Object lIndex(String key, long index) {
if (key == null) {
return null;
}
return redisTemplate.opsForList().index(key, index);
} /**
* @Description: 返回指定key关联的队列中的元素数量
* @Param: [key]
* @return: java.lang.Long
* @Author: MiZiMi
* @Date: 2020/4/28 18:24
*/
public Long lLen(String key) {
if (null == key) {
return 0L;
}
return redisTemplate.opsForList().size(key);
}
/** *************Set数据类型************* */
/**
* @Description: 向set中插入
* @Param:
* @return:
* @Author: MiZiMi
* @Date: 2020/4/28 18:24
*/
public Long sAdd(String key, Object... members) {
if (null == key) {
return 0L;
}
return redisTemplate.opsForSet().add(key, members);
} /**
* @Description: 返回set成员数量
* @Param: [key]
* @return: java.lang.Long
* @Author: MiZiMi
* @Date: 2020/4/28 18:26
*/
public Long sCard(String key) {
if (null == key) {
return 0L;
}
return redisTemplate.opsForSet().size(key);
} /**
* @Description: 判断是否是成员
* @Param: [key, member]
* @return: java.lang.Boolean
* @Author: MiZiMi
* @Date: 2020/4/28 18:26
*/
public Boolean sIsMember(String key, Object member) {
if (null == key) {
return false;
}
return redisTemplate.opsForSet().isMember(key, member);
} /**
* @Description: 随机返回一个成员
* @Param:
* @return:
* @Author: MiZiMi
* @Date: 2020/4/28 18:27
*/
public Object sRandomMember(String key) {
if (null == key) {
return null;
}
return redisTemplate.opsForSet().randomMember(key);
} /**
* @Description: 返回指定数量的成员
* @Param:
* @return:
* @Author: MiZiMi
* @Date: 2020/4/28 18:28
*/
public List<Object> sRandomMember(String key, int count) {
if (null == key) {
return null;
}
return redisTemplate.opsForSet().randomMembers(key, count);
} /**
* @Description: 随机删除一个member并返回
* @Param:
* @return:
* @Author: MiZiMi
* @Date: 2020/4/28 18:28
*/
public Object sPop(String key) {
if (null == key) {
return null;
}
return redisTemplate.opsForSet().pop(key);
} /**
* @Description: 获取所有member
* @Param:
* @return:
* @Author: MiZiMi
* @Date: 2020/4/28 18:30
*/
public Set<Object> sMembers(String key) {
if (null == key) {
return null;
}
return redisTemplate.opsForSet().members(key);
} /**
* @Description: 从与Key关联的Set中删除参数中指定的成员,不存在的参数成员将被忽略,
* 如果该Key并不存在,将视为空Set处理。返回从Set中实际移除的成员数量,如果没有则返回0
* @Param:
* @return:
* @Author: MiZiMi
* @Date: 2020/4/28 18:30
*/
public Long sRem(String key, Object... members) {
if (null == key) {
return 0L;
}
return redisTemplate.opsForSet().remove(key, members);
} /**
* @Description: 将一个集合中的元素移动到另外一个集合中去
* @Param:
* @return:
* @Author: MiZiMi
* @Date: 2020/4/28 18:31
*/
public Boolean sMove(String srckey, String dstkey, Object member) {
if (null == srckey || null == dstkey) {
return false;
}
return redisTemplate.opsForSet().move(srckey, member, dstkey);
} /**
* @Description: 获取两个集合的并集
* @Param:
* @return:
* @Author: MiZiMi
* @Date: 2020/4/28 18:31
*/
public Set<Object> sUnion(String key, String otherKeys) {
if (null == key || otherKeys == null) {
return null;
}
return redisTemplate.opsForSet().union(key, otherKeys);
}
//**********Sorted Set 数据类型******************** /**
* @Description: 添加参数中指定的所有成员及其分数到指定key的Sorted Set中,在该命令中我们可以指定多组score/member作为参数。
* 如果在添加时参数中的某一成员已经存在,该命令将更新此成员的分数为新值,同时再将该成员基于新值重新排序。
* 如果键不存在,该命令将为该键创建一个新的Sorted Set Value,并将score/member对插入其中。
* @Param:
* @return:
* @Author: MiZiMi
* @Date: 2020/4/28 18:32
*/
public Boolean zAdd(String key, double score, Object member) {
if (null == key) {
return false;
}
return redisTemplate.opsForZSet().add(key, member, score);
} /**
* @Description: 该命令将移除参数中指定的成员,其中不存在的成员将被忽略。
* 如果与该Key关联的Value不是Sorted Set,相应的错误信息将被返回。 如果操作成功则返回实际被删除的成员数量
* @Param:
* @return:
* @Author: MiZiMi
* @Date: 2020/4/28 18:32
*/
public Long zRem(String key, Object... members) {
if (null == key || null == members) {
return 0L;
}
return redisTemplate.opsForZSet().remove(key, members);
} /**
* @Description: 返回Sorted Set中的成员数量,如果该Key不存在,返回0。
* @Param:
* @return:
* @Author: MiZiMi
* @Date: 2020/4/28 18:33
*/
public Long zCard(String key) {
if (null == key) {
return 0L;
}
return redisTemplate.opsForZSet().size(key);
} /**
* @Description: 该命令将为指定Key中的指定成员增加指定的分数。如果成员不存在,该命令将添加该成员并假设其初始分数为0,
* 此后再将其分数加上increment。如果Key不存在,该命令将创建该Key及其关联的Sorted Set,
* 并包含参数指定的成员,其分数为increment参数。如果与该Key关联的不是Sorted Set类型,
* 相关的错误信息将被返回。如果不报错则以串形式表示的新分数。
* @Param:
* @return:
* @Author: MiZiMi
* @Date: 2020/4/28 18:34
*/
public Double zIncrby(String key, double score, Object member) {
if (null == key) {
throw new IllegalArgumentException("zIncrby key 不能为空");
}
return redisTemplate.opsForZSet().incrementScore(key, member, score);
} /**
* @Description: 该命令用于获取分数(score)在min和max之间的成员数量。
* (min=<score<=max)如果加上了“(”着表明是开区间例如zcount key (min max 则 表示(min<score=<max)
* 同理zcount key min (max 则表明(min=<score<max) 返回指定返回数量。
* @Param:
* @return:
* @Author: MiZiMi
* @Date: 2020/4/28 18:37
*/
public Long zCount(String key, double min, double max) {
if (null == key) {
return 0L;
}
return redisTemplate.opsForZSet().count(key, min, max);
} /**
* @Description: Sorted Set中的成员都是按照分数从低到高的顺序存储,该命令将返回参数中指定成员的位置值,
* 其中0表示第一个成员,它是Sorted Set中分数最低的成员。 如果该成员存在,则返回它的位置索引值。否则返回nil。
* @Param:
* @return:
* @Author: MiZiMi
* @Date: 2020/4/28 18:37
*/
public Long zRank(String key, Object member) {
if (null == key) {
return null;
}
return redisTemplate.opsForZSet().rank(key, member);
} /**
* @Description: 如果该成员存在,以字符串的形式返回其分数,否则返回null
* @Param:
* @return:
* @Author: MiZiMi
* @Date: 2020/4/28 18:37
*/
public Double zScore(String key, Object member) {
if (null == key) {
return null;
}
return redisTemplate.opsForZSet().score(key, member);
} /**
* @Description: 该命令返回顺序在参数start和stop指定范围内的成员,这里start和stop参数都是0-based,即0表示第一个成员,-1表示最后
* 一个成员。如果start大于该Sorted
* Set中的最大索引值,或start > stop,此时一个空集合将被返回。如果stop大于最大索引值,
* 该命令将返回从start到集合的最后一个成员。如果命令中带有可选参数WITHSCORES选项,
* 该命令在返回的结果中将包含每个成员的分数值,如value1,score1,value2,score2...。
* @Param: [key, min, max]
* @return: java.util.Set<java.lang.Object>
* @Author: MiZiMi
* @Date: 2020/4/28 18:38
*/
public Set<Object> zRange(String key, long min, long max) {
if (null == key) {
return null;
}
return redisTemplate.opsForZSet().range(key, min, max);
} /**
* @Description: 该命令的功能和ZRANGE基本相同,唯一的差别在于该命令是通过反向排序获取指定位置的成员,
* 即从高到低的顺序。如果成员具有相同的分数,则按降序字典顺序排序。
* @Param: [key, start, end]
* @return: java.util.Set<java.lang.Object>
* @Author: MiZiMi
* @Date: 2020/4/28 18:38
*/
public Set<Object> zReverseRange(String key, long start, long end) {
if (null == key) {
return null;
}
return redisTemplate.opsForZSet().reverseRange(key, start, end);
} /**
* @Description: 该命令将返回分数在min和max之间的所有成员,即满足表达式min <= score <= max的成员,
* 其中返回的成员是按照其分数从低到高的顺序返回,如果成员具有相同的分数,
* 则按成员的字典顺序返回。可选参数LIMIT用于限制返回成员的数量范围。
* 可选参数offset表示从符合条件的第offset个成员开始返回,同时返回count个成员。
* 可选参数WITHSCORES的含义参照ZRANGE中该选项的说明。*最后需要说明的是参数中min和max的规则可参照命令ZCOUNT。
* @Param: [key, min, max]
* @return: java.util.Set<java.lang.Object>
* @Author: MiZiMi
* @Date: 2020/4/28 18:39
*/
public Set<Object> zRangeByScore(String key, double min, double max) {
if (null == key) {
return null;
} return redisTemplate.opsForZSet().rangeByScore(key, min, max);
} /**
* @Description: 该命令除了排序方式是基于从高到低的分数排序之外,其它功能和参数含义均与ZRANGEBYSCORE相同。
* 需要注意的是该命令中的min和max参数的顺序和ZRANGEBYSCORE命令是相反的。
* @Param: [key, min, max]
* @return: java.util.Set<java.lang.Object>
* @Author: MiZiMi
* @Date: 2020/4/28 18:39
*/
public Set<Object> zReverseRangeByScore(String key, double min, double max) {
if (null == key) {
return null;
}
return redisTemplate.opsForZSet().reverseRangeByScore(key, min, max);
}
}

redisConfig+redisUtil开箱即用的更多相关文章

  1. Redis 配置连接池,redisTemplate 操作多个db数据库,切换多个db,解决JedisConnectionFactory的设置连接方法过时问题。(转)

    环境 springmvc jdk1.8 maven redis.properties配置文件 #redis setting redis.host=localhost redis.port=6379 r ...

  2. Redis和springboot 整合redisUtil类

    一.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  3. RedisUtil 工具类

    package com.test; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import red ...

  4. Kinect2.0 for Mac开箱

    前段时间从米国带回来一个Kinect,坑爹地发现需要适配器才能连接电脑.于是又从微软官网下单了适配器.今天终于在Mac上把Kinect装起来跑了,与大家分享一点图片. Kinect驱动安装 Kinec ...

  5. Cubieboard 开箱和入门 | Name5566 分类: cubieboard 2014-11-08 17:27 251人阅读 评论(0) 收藏

    Cubieboard 开箱和入门 2014 年 01 月 29 日 by name5566 Categories: Computer Science, Cubieboard Hello Cubiebo ...

  6. 【Xbox one S】开箱&开机&初入坑心得

    再来一发水贴,先上产品标准照镇贴: 前言 身为一个资深单机游戏玩家,常年混迹在PC平台,但内心深处一直对主机有种迷之向往,感觉那才是单机游戏的正处之地,坐沙发上拿着手柄对着电视跌宕起伏才是正确的游戏姿 ...

  7. 2019 Valentine's Day 圣地巡礼和WPR003N开箱刷U-boot记录

    即兴打出这个标题,似乎性息量有点大,后面的内容真的和你想象的是一样的吗? 自上一篇blog告别这里有多少年了,掐指一算,今天是一个回归的日子,看着这里搭上云之路,渐渐的变成了云主机中的一员,感慨时事境 ...

  8. 小米众筹新品---8H凉感慢回弹记忆绵枕 99元 上手开箱图

    在众目睽睽之下,商城终于成了杂货铺 众筹发布了第98期新品——8H凉感慢回弹记忆绵枕H1,售价为99元,主打舒适凉感,抗菌吸湿,三曲线护颈设计,3~5秒慢回弹. 本着程序员的读书历程:x 语言入门 — ...

  9. 完美脱离Windows!! Linux发行版第一系统 Manjaro 开箱教程 :)

    没兴趣? 来几张图敌敌畏(kai kai wei) !! 0x00 预览(zhuangbi) 0x01 引言(feihua) 当我们想用ssh工具时,不像telnet那样是系统自带的软件,需要额外安装 ...

  10. Netty 系列七(那些开箱即用的 ChannelHandler).

    一.前言 Netty 为许多通用协议提供了编解码器和处理器,几乎可以开箱即用, 这减少了你在那些相当繁琐的事务上本来会花费的时间与精力.另外,这篇文章中,就不涉及 Netty 对 WebSocket协 ...

随机推荐

  1. JavaScript 默认参数、动态参数、剩余参数

    默认参数: <script> function selet(num, max) { console.log(num + max); } selet(1, 5); </script&g ...

  2. Java 超新星开源项目 Solon v1.10.10 发布

    一个更现代感的 Java 应用开发框架:更快.更小.更自由.主框架仅 0.1 MB.Helloworld: @Controller public class App { public static v ...

  3. Intel GPU Gen 9 架构

    * 参考spec:the-compute-architecture-of-intel-processor-graphics-gen9-v1d0.pdf SOC 架构 Gen9 架构是早期用在igpu ...

  4. Spring Boot 中使用 tkMapper

    说明:基于 MyBatis 有很多第三方功能插件,这些插件可以完成数据操作方法的封装.数据库逆向工程的生成等. tkMapper 和 MyBatis-plus 都是基于 MyBatis 提供的第三方插 ...

  5. 【网络】内网穿透方案&FRP内网穿透实战(基础版)

    目录 前言 方案 方案1:公网 方案2:第三方内网穿透软件 花生壳 cpolar 方案3:云服务器做反向代理 FRP简介 FRP资源 FRP原理 FRP配置教程之SSH 前期准备 服务器配置 下载FR ...

  6. Git+Github协作开发流程

    采用合作开发者的方式进行协作开发,下面以zlcook和zlserver合作开发iqas-ios-record项目为例进行讲解,zlcook为项目创建者,zlserver为项目参与者.协作开发步骤如下: ...

  7. Mysql通过Merge引擎进行分表

    Mysql通过Merge引擎进行分表 转载: https://www.jianshu.com/p/9420a6a8ae2e https://www.cnblogs.com/xbq8080/p/6628 ...

  8. sqlserver数据库还原

    这里是从A服务器备份的数据库文件,还原到本地B电脑的数据库.因数据库版本相同,故而未曾出现其他版本问题 1.有个bak的备份文件 2.在B电脑新建一个数据库test. 3.设置test数据库的访问限制 ...

  9. 【深入浅出 Yarn 架构与实现】4-1 ResourceManager 功能概述

    前面几篇文章对 Yarn 基本架构.程序基础库.应用设计方法等进行了介绍.之后几篇将开始对 Yarn 核心组件进行剖析. ResourceManager(RM)是 Yarn 的核心管理服务,负责集群管 ...

  10. layui文件上传

    //前端代码 <div class="layui-form-item"> <label class="layui-form-label"> ...