基本
nosql ---> 集群利用 ----> redis功能开发
nosql:除了关系型数据库,key(String):value(多种类型) 的键值对类型
作用
用于缓存(先查找reids,没有在找sql)
排行榜(热门帖子)
消息队列(少用)
不要在使用reids的地方又使用sql查询,这样会使得效率变低的
基本类型和操作
-
redis-cli使用客户端 -
select 1默认有 0 - 15 的数据库,选择 1 -
flushdb刷新其他类型还有很多不同的操作,详细看文档,或者参考牛客test -
set test:count 1设置变量,多个单词变量名使用:隔开,相当于test_count -
get test:count获取 -
incr test:count自增 -
decr test:count自减 -
集合类型操作元素
add key 元素key,元素valueadd user name "zc"remove key 元素key
-
keys *使用键值对 -
type test:count类型?
10.exists test:count 存在?
11.del test:count 删除
12.expire test:count 10 设置存活时间10秒,可以指定单位
需要注意的是:reids假如过期了,会直接删除key,而不是设置为null
自启动
安装服务:redis-server --service-install redis.windows-service.conf
卸载服务:redis-server --service-uninstall
list
的特殊,可以作为栈或者队列
set(集合不重复,且无序)
可以随机弹出一些元素
zset(有序集合)
可以像hash,只是value是数值,且会自动按照数值排序
使用java得到的set也是有序的:www.cnblogs.com/gigabit/p/1…
hash的结构
事务
- 所以常常使用编程式事务管理,就是为了可以在同一个方法前查询,而不是使用声明式就无法在一个方法中干事务之外的活了,如下示例
- 事务没有回滚操作,所以开事务不是为了回滚,事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 Redis事务的主要作用就是串联多个命令防止别的命令插队。就没有隔离的必要,但是没有原子性
// 编程式事务
@Test
public void testTransaction() {
Object result = redisTemplate.execute(new SessionCallback() {
@Override
public Object execute(RedisOperations redisOperations) throws DataAccessException {
String redisKey = "text:tx";
//提前查询,不会和事务一起提交,而是先执行
redisOperations.opsForSet().members(redisKey);
// 启用事务,一个事务的所有指令会放到一个队列中后在一起执行,而且没有快照
redisOperations.multi();
redisOperations.opsForSet().add(redisKey, "zhangsan");
redisOperations.opsForSet().add(redisKey, "lisi");
redisOperations.opsForSet().add(redisKey, "wangwu");
System.out.println(redisOperations.opsForSet().members(redisKey));
// 提交事务
return redisOperations.exec();
}
});
System.out.println(result);
}
持久化
比较是内存的东西,需要写到磁盘才会持久化
高级类型
HyperLogLog
- 采用一种基数算法,用于完成独立总数的统计。 - 占据空间小,无论统计多少个数据,只占12K的内存空间。 - 不精确的统计算法,标准误差为 0.81% 。
就是一个类似set的东西,都是存放到rdies的大小恒定12k,而且这玩意只能用于统计去重数量(估算)
基本使用
Bitmap
- 不是一种独立的数据结构,实际上就是字符串。 - 支持按位存取数据,可以将其看成是byte数组。 - 适合存储索大量的连续的数据的布尔值