Redis笔记

Redis是互联网应用常用的内存告诉缓存数据库,读写速度非常快。

一、Redis的应用场景

  1. 高并发的读写
  2. 计数器
  3. 排行榜
  4. 分布式会话
  5. 互动场景
  6. 最新列表

 

二、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(或任何其他远程键/值存储)。

posted @ 2020-03-15 20:55  kerwin cui  阅读(234)  评论(0编辑  收藏  举报