Redis教程
1.1 初始redis
1.1.1 什么是Redis
Redis(Remote Dictionary Server 远程字典服务),一个开源的key-value型数据库,它可给予内存亦可以持久化,并提供了多种语言的API。它通常被称为数据结构服务器,因为它的value不仅仅可以是String字符串,也可以是hash(哈希)、列表(list)、集合(set)、有序集合(sorted set)等类型。
1.1.2 为什么选择Redis
a.特点
1)支持数据持久化,可以将内存的数据保存到磁盘中,重启后再次加载到内存
2)支持多种数据类型,String/list/set/zset/hash等数据类
3)支持支持数据的备份,即master-slave模式的数据备份(分布式)
b.优势
1)性能极高,Redis能读的速度是110000次/s,写的速度是81000次/s
2)原子性,即所有操作要么全部成功或者全部失败,并且多个操作时支持
c.为什么选择Redis
1)减轻CPU和内存压力
2)减少IO操作,减轻IO压力
3)高扩展性,关系型数据库很难改变表结构
1.1.3 使用场景
数据高并发、海量数据读写、多扩展要求高的数据,适合使用redis
1)配合关系型数据库,做高速缓存,对高频次访问的数据进行缓存,降低IO操作
2)分布式架构,session共享
3)不同数据类型特定使用场景
a)String:分布式锁、计数器、分布式全局唯一id
b)List:消息队列、qq用户消息列表
c)Set:抽奖、点赞、签到、电商商品筛选、关注(微博)
1.2 Redis安装
1.2.1 Windows下安装
下载地址:https://github.com/MSOpenTech/redis/releases
Redis支持 32 位和 64 位
a.下载路径如下
b.选中 Redis-x64-3.2.100.zip,下载后进行解压即可。解压后路径如下图
c.打开Redis的服务端和客户端
双击redis-server.exe打开redis的服务端
双击redis-cli.exe打开客户端,客户端内进行操作
d.设置密码
找到redis.windows.conf文件下的requirepass foobared,改为 requirepass 密码
windows下注册Redis服务:redis-server.exe --service-install redis.windows.conf
1.2.2 Linux下安装
下载地址:http://redis.io/download ,当前版本 redis-5.0.6.tar.gz
a.解压安装
tar xzf redis-2.8.17.tar.gz
b.make
解压后,cd切换到redis安装路径,make
make后才会出现Redis的服务端和客户端
c.启动
make完后 redis-2.8.17目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli,两个程序位于安装目录 src 目录下 。
# 启动服务端
$ cd src
$ ./redis-server
#启动客户端
$ cd src
$ ./redis-cli
d.设置密码
修改redis.conf配置文件,修改后需要重启服务
# requirepass foobared
requirepass 123 指定密码123
1.3 Redis数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
String字符串
可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512MB
hash哈希
键值对集合,即编程语言中的Map类型,适合存储对象,可以存储键值对约40多亿,使用场景为存储、读取、修改用户属性
List(列表)
双向链表,增删快,可存储约40多亿个对象
适用场景如下:1)最新消息排行等功能(比如朋友圈的时间线) 2)消息队列
Set(集合)
哈希表实现元素不重复,可存储约40多亿个对象
适用场景如下:1)共同好友 2)利用唯一性,统计访问网站的所有独立ip 3)好友推荐时,根据tag求交集,大于某个阈值就可以推荐
Sorted Set(有序集合)
数据插入集合时,已经进行天然排序,可存储约40多亿个对象
适用场景如下:1)排行榜 2)带权重的消息队列
1.4 Redis命令
1.4.1 Redis 字符串(String)
SET key value
设置指定 key 的值
GET key
获取指定 key 的值。
MGET key1 [key2..]
获取所有(一个或多个)给定 key 的值。
1.4.2 Redis 哈希(Hash)
HSET key field value
将哈希表 key 中的字段 field 的值设为 value
HGET key field
获取存储在哈希表中指定字段的值。
HGETALL key
获取在哈希表中指定 key 的所有字段和值
HKEYS key
获取所有哈希表中的字段
HLEN key
获取哈希表中字段的数量
HVALS key
获取哈希表中所有值
1.4.3 Redis 列表(List)
LPUSH key value1 [value2]
将一个或多个值插入到列表头部
LRANGE key start stop
获取列表指定范围内的元素
RPUSH key value1 [value2]
在列表中添加一个或多个值
LSET key index value
通过索引设置列表元素的值
LPOP key
移出并获取列表的第一个元素
LINDEX key index
通过索引获取列表中的元素
1.4.4 Redis 集合(Set)
SADD key member1 [member2]
向集合添加一个或多个成员
SCARD key
获取集合的成员数
SMEMBERS key
返回集合中的所有成员
SPOP key
移除并返回集合中的一个随机元素
SISMEMBER key member
判断 member 元素是否是集合 key 的成员
SINTER key1 [key2]
返回给定所有集合的交集
SUNION key1 [key2]
返回所有给定集合的并集
1.4.5 Redis 有序集合(sorted set)
ZADD key score1 member1 [score2 member2]
向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZCARD key
获取有序集合的成员数
ZRANK key member
返回有序集合中指定成员的索引
ZREM key member [member ...]
移除有序集合中的一个或多个成员
1.5 Java使用Redis
1.5.1 使用Jedis连接Redis
Jedis jedis = new Jedis("localhost");#连接url
jedis.auth("123456");#设置连接密码,若redis没有设置密码,可省略
1.5.2 使用Jedis操作Redis
//Redis Java String(字符串) 实例
jedis.set("runoobkey", "www.runoob.com");//设置 redis 字符串数据
jedis.get("runoobkey");// 获取存储的数据
//Redis Java List(列表) 实例
jedis.lpush("site-list", "Runoob");
jedis.lpush("site-list", "Google");
jedis.lpush("site-list", "Taobao");
List<String> list = jedis.lrange("site-list", 0 ,2);// 获取存储的数据
//Redis Java Keys 实例
Set<String> keys = jedis.keys("*");
1.6 SpringBoot整合Redis
SpringBoot整合Redis步骤
1) 连接池,JedisPoolConfig(相当于BasicDataSource)
2) 连接工厂,RedisConnectionFactory(相当于SqlSessionFactoryFactory)
3) 连接操作对象RedisTemplate(相当于SqlSessionTemplate)
1.6.1 pom.xml
Spring对Redis的支持是使用Spring Data Redis来实现的
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
1.6.2 applicaiton.properties
#服务器地址
spring.redis.host=127.0.0.1
# 端口号,默认6379
spring.redis.port=6379
#密码,默认没有
spring.redis.password=123456
#最大连接数
spring.redis.jedis.pool.max-active=8
#连接池最大空闲连接数
spring.redis.jedis.pool.max-idle=8
#连接池最小空闲数
spring.redis.jedis.pool.min-idle=8
#连接超时时间,毫秒
spring.redis.timeout=1000
1.6.3 常用操作
操作对象StringRedisTemplate<k,v>,RedisTemplate<k,v>,StringRedisTemplate操作时,k、v都必须为字符串,RedisTemplate操作时,k、v都必须为Object
常用操作方法:
opsForValue():操作只有简单属性的数据
opsForList():操作含有List的数据
opsForSet():操作含有set的数据
opsForHash():操作含有hash的数据
opsForZSet():操作含有有序set类型ZSet的数据
opsForValue常用方法
方法:
set(K key, V value) // 新增一个字符串类型的值,key是键,value是值。
get(Object key) // 获取key键对应的值。
apend(K key, String value)//在原有的值基础上新增字符串到末尾,必须使用StringRedisTemplate
size(K key) //获取指定字符串的长度
示例:
stringRedisTemplate.opsForValue().set("str","xm");//添加字符串
String str = stringRedisTemplate.opsForValue().get("str");//获取字符串
stringRedisTemplate.opsForValue().append("str","123"); //追加字符串
opsForList常用方法
方法:
//追加
leftPush(K key, V value) //在变量左边添加元素值
leftPushAll(K key, Collection<V> values) //向左边批量添加参数元素
rightPush(K key, V value) //向集合最右边添加元素
rightPushAll(K key, Collection<V> values) //向右边批量添加元素
set(K key, long index, V value)//指定位置插入元素,已有则覆盖,没有则新增
//移除
leftPop(K key) //移除集合中的左边第一个元素
rightPop(K key)// 移除集合中右边的第一个元素
//count>0,删除左边第一个等于value的元素,count<0,删除右边第一个等于value的元素,
//count=0删除等于value的所有元素
remove(K key, long count, Object value)
//获取
size(K key) //获取集合长度
index(K key, long index)//获取集合指定位置的值
range(K key, long start, long end)//获取指定区间的值
//示例
stringRedisTemplate.opsForList().leftPush("list","左11");
stringRedisTemplate.opsForList().rightPush("list","右11");
stringRedisTemplate.opsForList().leftPop("list");
stringRedisTemplate.opsForList().rightPop("list");
stringRedisTemplate.opsForList().size("list");
stringRedisTemplate.opsForList().index("list",1);
stringRedisTemplate.opsForList().range("list",0,3);
opsForSet常用方法
方法:
//添加
add(K key, V... values) //向变量中批量添加值
//查询
size(K key) //获取变量中值的长度
isMember(K key, Object o) //检查给定的元素是否在变量中
members(K key) //获取变量中的值
randomMember(K key) //随机获取变量中的元素
intersect(K key, K otherKey) // 获取2个变量中的交集
union(K key, K otherKey) //获取2个变量的合集
//移动
move(K key, V value, K destKey) //转移变量的元素值到目的变量
//删除
pop(K key) //弹出变量中的元素
remove(K key, Object... values) //批量移除变量中的元素
示例:
stringRedisTemplate.opsForSet().add("set","a","b","c","d");
stringRedisTemplate.opsForSet().members("set");
stringRedisTemplate.opsForSet().isMember("set","a")
stringRedisTemplate.opsForSet().randomMember("set");
stringRedisTemplate.opsForSet().size("set")
stringRedisTemplate.opsForSet().pop("set");
opsForHash常用方法
put(H key, HK hashKey, HV value) //新增hashMap值
putAll(H key, Map<? extends HK,? extends HV> m) //以map集合的形式添加键值对
hasKey(H key, Object hashKey) //判断变量中是否有指定的map键
keys(H key) //获取变量中的键
get(H key, Object hashKey) //获取变量中的指定map键的值,没有返回null
values(H key) //获取指定变量中的hashMap值
size(H key) //获取变量的长度
delete(H key, Object... hashKeys) //删除变量中的键值对
opsForZSet常用方法
add(K key, V value, double score) //添加元素到变量中同时指定元素的分值
range(K key, long start, long end) //获取变量指定区间的元素
rangeByScore(K key, double min, double max) //根据设置的score获取区间值
reverseRange(K key, long start, long end) //索引倒序排列指定区间元素
rank(K key, Object o) //获取变量中元素的索引,下标开始位置为0
reverseRank(K key, Object o) //获取倒序排列的索引值
count(K key, double min, double max) //获取区间值的个数
score(K key, Object o) //获取元素的分值
zCard(K key) //获取变量中元素的个数
intersectAndStore(K key, K otherKey, K destKey) //获取2个变量的交集存放到第3个变量里面
unionAndStore(K key, K otherKey, K destKey) //获取2个变量的合集存放到第3个变量里面
remove(K key, Object... values) //批量移除元素根据元素值
removeRangeByScore(K key, double min, double max) //根据分值移除区间元素
removeRange(K key, long start, long end) //根据索引值移除区间元素
1.6.4 Web中的使用
spring-data-redis可以通过注入StringRedisTemplate<String,String>和RedisTemplate<Object,Object>两种方式操作redis。StringRedisTemplate继承自RedisTemplate是对string类型的key-vale的特殊处理类
K , V均是字符串
stringRedisTemplate.opsForValue().set("str", "xm"); //存储
String str = stringRedisTemplate.opsForValue().get("str"); //获取
K , V均是对象
-
当对象未实现序列化接口Serializable时
注意:当对象未初始化时,存储数据时会出现异常: org.springframework.data.redis.serializer.SerializationException
-
当对象实现序列化接口Serializable时
User user = new User("索隆", "sl", 20); redisTemplate.opsForValue().set("user",user); //存储 User user = (User)redisTemplate.opsForValue().get("user"); //获取
注意:当存储对象时,redis数据中K,V的显示均为Unicode,阅读性很差。
-
解决对象存储编码问题
Redis为我们提供了RedisTemplate和StringRedisTemplate,但是不灵活(第一没有序列化,第二泛型为<Object, Object>),所以自己实现RedisTemplate或StringRedisTemplate
@Configuration
public class RedisConfig{
@Bean
public RedisTemplate<String,Object>redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String,Object>template=new RedisTemplate<>();
template.setConnectionFactory(factory);//关联
//设置key的序列化器
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
//设置value的序列化器
GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
return template;
}
}