Redis笔记
Redis是互联网应用常用的内存告诉缓存数据库,读写速度非常快。
一、Redis的应用场景
- 高并发的读写
- 计数器
- 排行榜
- 分布式会话
- 互动场景
- 最新列表
二、Redis数据类型
数据类型 | 存储的值 | RedisTemplate方法 | 应用场景 |
string (字符串) | 字符串、整数、浮点数 | opsForValue() | 计数器 |
list (列表) | 一个链表,链表上每个节点都包含一个字符串 | opsForList() | 最新列表、消息队列、数据统计 |
set (集合) | 包含字符串的无序收集器,每个字符串都是独一无二的 | opsForSet() | 不重复的集合,例如独立IP、共同好友 |
hash (散列) | 包含键值对的无序散列表 | opsForHash() | 存储、读取、修改用户属性 |
zset (有序集合,sorted set) | 字符串成员与浮点数分值之间的有序映射,元素的排列顺序由分值的大小决定 | opsForZSet() | 排行榜 |
三、RedisTemplate操作Redis
1.操作字符串
//存储 redisTemplate.opsForValue().set("key","123"); //获取 redisTemplate.opsForValue().get("key"); //3秒后存储的字符串失效 redisTemplate.opsForValue().set("key","123",3,TimeUnit.SECONDS); //替换key所存储的字符串值,从偏移量5开始 redisTemplate.opsForValue().set("key","newValue",5); //设置键的字符串值,并返回其旧值 redisTemplate.opsForValue().getAndSet("key","newValue"); //如果key存在并且是字符串,值会被追加到字符串末尾,如果key不存在,则会创建,设置值为空字符串 redisTemplate.opsForValue().append("key","value"); //获取value值得长度 redisTemplate.opsForValue().size("key")
2.操作散列
//多个散列字段存储到key对应的散列表中 Map<string,Object> map=new HashMap(); map.put("name","zhangsan"); map.put("name","lisi"); rediaTemplate.opsForHash().putAll("key",map); //散列存储到key对应的散列表中 rediaTemplate.opsForHash().put("key","name","zhangsan"); //根据key获取指定散列的值 rediaTemplate.opsForHash().get("key","key"); //根据key获取散列表中所有的值 rediaTemplate.opsForHash().values("key"); //根据key获取散列表中所有的key rediaTemplate.opsForHash().keys("key"); //根据key获取散列表中所有的散列 rediaTemplate.opsForHash().entries("key"); //删除指定key的散列 rediaTemplate.opsForHash().delete("key","key"); //确定hasKey是否存在 rediaTemplate.opsForHash().hasKey("key","key"); //获取key对应散列表的大小个数 rediaTemplate.opsForHash().size("key");
3.操作列表
//左边批量添加元素 rediaTemplate.opsForList().leftPushAll("key",new String[]{"1","2","3"}); //存储在键中的列表大小 rediaTemplate.opsForList().size("key"); //将所有指定的值插入在键的列表的头部,如果键不存在,则在推送之前创建为空列表(左边插入) rediaTemplate.opsForList().leftPush("key","1"); //将所有指定的值插入在键的列表的头部,如果键不存在,则在推送之前创建为空列表(右边插入) rediaTemplate.opsForList().rightPush("key","1"); //右边批量添加元素 rediaTemplate.opsForList().rightPushAll("key",new String[]{"1","2","3"}); //从列表1的位置设置值 rediaTemplate.opsForList().set("key",1,"value"); //删除列表中前两次出现值为1的元素 rediaTemplate.opsForList().remove("key",2,"1"); //获取列表中下标为5的值 rediaTemplate.opsForList().index("key",5); //弹出最左边的元素 rediaTemplate.opsForList().leftPop("key"); //弹出最右边的元素 rediaTemplate.opsForList().rightPop("key");
4.操作集合
//无序集合中添加不重复元素 rediaTemplate.opsForSet().add("key","value"); rediaTemplate.opsForSet().add("key","value1","value2","...."); //删除元素 rediaTemplate.opsForSet().remove("key","value1"); rediaTemplate.opsForSet().remove("key","value1","value2","...."); //移除并返回集合中的一个随机元素 rediaTemplate.opsForSet().pop("key"); //移动元素 rediaTemplate.opsForSet().move("key","value","destKey") //无序集合大小长度 rediaTemplate.opsForSet().size("key"); //返回集合中的所有成员 rediaTemplate.opsForSet().members("key"); //遍历集合 Cursor<object> cursor=rediaTemplate.opsForSet().scan("key",ScanOptions.NONE); while(cursor.hasNext()){ System.out.println(cursor.next()); }
5.操作有序集合
zset是string类型元素的集合,且不允许重复的成员。每个元素都会关联一个double类型的分数(score)。可以通过分数将集合中的成员从小到大进行排序。
//新增有序集合 ZSetOperations.TypedTuple<Object> tuple1=new DefaultTypedTuple<>("key1",1); ZSetOperations.TypedTuple<Object> tuple2=new DefaultTypedTuple<>("key2",2); Set<ZSetOperations.TypedTuple<Object>> tuples=new HashSet<ZSetOperations.TypedTuple<object>>(); tuples.add(tuple1); tuples.add(tuple2); rediaTemplate.opsForZSet().add("key",tuples); //新增有序集合,如果存在则返回false,如果不存在则返回true。 rediaTemplate.opsForZSet().add("key","value",1.0); //移除一个或多个元素 rediaTemplate.opsForZSet().remove("key","value1","value2"); //返回指定成员的排名 rediaTemplate.opsForZSet().rank("key","value"); //返回指定区间内的成员 rediaTemplate.opsForZSet().range("key",0,-1); //通过分数返回指定区间内的成员个数 rediaTemplate.opsForZSet.count("key",0,5); //成员数 rediaTemplate.opsForZSet().size("key"); //获取指定成员的score值 rediaTemplate.opsForZSet().score("key","value"); //移除指定索引位置的成员 rediaTemplate.opsForZSet().removeRange("key",0,-1); //遍历ZSet Cursor<ZSetOperations.TypedTuple<Object>> cursor=rediaTemplate.opsForSet().scan("key",ScanOptions.None); while(cursor.hasNext()){ ZSetOperations.TypedTuple<Object> item = cursor.next(); System.out.println(item.getValue()+":"+item.getScore()); }
6.其他
Redis是一个远程数据结构服务器。它肯定比将数据存储在本地内存中要慢(因为它涉及套接字往返存取数据)。但是,它也带来了一些有趣的属性:
- Redis可以被应用程序的所有进程访问,可能运行在多个节点上(本地内存无法实现)。
- Redis内存存储非常高效,并在单独的过程中完成。如果应用程序在内存被垃圾收集的平台上运行(node.js,java等),它允许处理更大的内存缓存/存储。在实践中,非常大的堆用垃圾收集语言表现不佳。
- 如果需要,Redis可以将数据保存在磁盘上。
- Redis不仅仅是一个简单的缓存:它提供了各种数据结构,各种项目驱逐策略,阻塞队列,pub / sub,原子性,Lua脚本等等。
- Redis可以使用主/从机制来复制其活动,以实现高可用性。
基本上,如果需要你的应用程序在共享相同数据的多个节点上进行扩展,则需要类似Redis(或任何其他远程键/值存储)。