redis
一、redis简介
redis是开放源代码的内存数据结构存储,用作数据库,缓存和消息代理。Redis提供数据结构,例如字符串,哈希,列表,集合,带范围查询的排序集合,位图,超日志,地理空间索引和流。redis具有内置的复制,Lua脚本,LRU逐出,事务和不同级别的磁盘持久性,并通过以下方式提供高可用性Redis Sentinel 和 Redis Cluster自动分区。
redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
1.Redis与其他key-value缓存产品有以下三个特点:
Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
2.redis优点:
性能极高
:Redis能读的速度是110000次/s,写的速度是81000次/s。
丰富的数据类型
:Redis支持二进制案例的Strings,Lists,Hashes,Sets 及Ordered Sets数据类型操作。
原子
:Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
丰富的特性
:Redis还支持publicsh/subscribe,通知key过期等等特性。
3.Redis与其他key-value存储有什么不同?
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,应为数据量不能大于硬件内存,在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
二、redis安装
1.Window 下安装
下载地址:https://github.com/dmajkic/redis/downloads。
下载到的Redis支持32bit和64bit。根据自己实际情况选择,将64bit的内容cp到自定义盘符安装目录取名redis。 如 C:\reids打开一个cmd窗口 使用cd命令切换目录到 C:\redis 运行 redis-server.exe redis.conf 。
2. Linux 下安装
下载地址:http://www.redis.net.cn/download/,下载最新文档版本。
本教程使用的最新文档版本为 2.8.17,下载并安装:
$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz$ tar xzf redis-2.8.17.tar.gz$ cd redis-2.8.17$ make
make完后 redis-2.8.17目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli
下面启动redis服务.
$ ./redis-server
注意这种方式启动redis 使用的是默认配置。也可以通过启动参数告诉redis使用指定配置文件使用下面命令启动。
$ ./redis-server redis.conf
redis.conf是一个默认的配置文件。我们可以根据需要使用自己的配置文件。
启动redis服务进程后,就可以使用测试客户端程序redis-cli和redis服务交互了。 比如:
$ ./redis-cliredis> set foo barOKredis> get foo"bar"
三、redis-cli操作五种数据类型
1.String
set:添加一条String类型数据
Get: 获取一条String类型数据
Mset:添加多条String类型数据
Mget:获取多条String类型数据
2.Hash
Hset:添加一条hash类型数据
Hget:获取一条hash类型数据
Hmset:添加多条hash类型数据
Hmget:获取多条hash类型数据
HgetAll:获取指定所有hash类型数据
Hdel:删除指定hash类型数据
3.List
Lpush:左添加头list类型数据
Rpush: 右添加尾类型数据
Lrange:获取list类型数据 start 起始下标 end 结束下标 包含关系
llen: 获取条数
lrem: 删除列表中几个指定list类型数据
3.Set
Sadd:添加 set 类型数据 Smembers 获取 set 类型数据
scard: 获取条数 srem: 删除数据
4.Sorted set
sorted set 是通过分数值来进行排序的,分数值越大,越靠后。
Zadd:添加 sorted set 类型数据
Zrange:获取 sorted set 类型数据
zcard:获取条数
zrem:删除数据
Redis中以层级关系、目录形式存储数据
mset user:01 zhangsan 设置数据
mget user:01 获取数据
删除
Del:用于删除数据(通用,适用于所有数据类型)
Hdel:用于删除 hash 类型数据
四、Java使用redis
1.jedis使用Redis
添加依赖 pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!--
1.x 的版本默认采用的连接池技术是 Jedis,
2.0 以上版本默认连接池是 Lettuce,
如果采用 Jedis,需要排除 Lettuce 的依赖。
-->
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- jedis 依赖 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
配置文件application.yml
spring:
redis:
# Redis服务器地址
host: 192.168.10.100
# Redis服务器端口
port: 6379
# Redis服务器端口
password: root
# Redis服务器端口
database: 0
# 连接超时时间
timeout:10000ms
lettuce:
pool:
# 最大连接数,默认8
max-active: 1024
# 最大连接阻塞等待时间,单位毫秒,默认-1ms
max-wait: 10000ms
# 最大空闲连接,默认8
max-idle: 200
# 最小空闲连接,默认0
min-idle: 5
redis连接
/**
\* 直接创建jedis客户端
*/
@Test
public void initConnt01() {
//创建jedis客户端
Jedis jedis = new Jedis("192.168.10.100", 6379);
//设置连接密码
jedis.auth("root");
//测试是否连接成功
String pong = jedis.ping();
System.out.println(pong);
//string set
jedis.set("name", "zhangsan");
//string get
String name = jedis.get("name");
System.out.println(name);
if (null != jedis) {
jedis.close();
}
}
封装JedisUtil对外提供连接对象获取方法
/**
\* Redis配置
*/
@Configuration
public class RedisConfig {
//服务器地址
@Value("${spring.redis.host}")
private String host;
//端口
@Value("${spring.redis.port}")
private int port;
//密码
@Value("${spring.redis.password}")
private String password;
//超时时间
@Value("${spring.redis.timeout}")
private String timeout;
//最大连接数
@Value("${spring.redis.jedis.pool.max-active}")
private int maxTotal;
//最大连接阻塞等待时间
@Value("${spring.redis.jedis.pool.max-wait}")
private String maxWaitMillis;
//最大空闲连接
@Value("${spring.redis.jedis.pool.max-idle}")
private int maxIdle;
//最小空闲连接
@Value("${spring.redis.jedis.pool.min-idle}")
private int minIdle;
@Bean
public JedisPool getJedisPool(){
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(maxTotal);
poolConfig.setMaxWaitMillis(Long.valueOf(maxWaitMillis.substring(0,maxWaitMillis.lengt
h()-2)));
poolConfig.setMaxIdle(maxIdle);
poolConfig.setMinIdle(minIdle);
return new
JedisPool(poolConfig,host,port,Integer.valueOf(timeout.substring(0,timeout.length()-2)),password);
}
}
操作数据类型
@Test
public void testString() {
//set 设值,单条数据
jedis.set("hehe", "heihei");
//get 取值,单条数据
String hehe = jedis.get("hehe");
System.out.println(hehe);
//mset 设值,多条数据
jedis.mset("xixi", "lala", "hengheng", "honghong");
//mget 取值,多条数据
List<String> mget = jedis.mget("xixi", "hengheng");
mget.forEach(e -> System.out.println(e));
//删除
jedis.del("hengheng");
}
/**
\* 操作hash
*/
@Test
public void testHash() {
//hset 设值,单条数据
jedis.hset("user", "name", "zhangsan");
//hget 取值,单条数据
String hget = jedis.hget("user", "name");
System.out.println(hget);
//hmset 设值,多条数据
Map<String, String> map = new HashMap<>();
map.put("age", "20");
map.put("address", "sh");
jedis.hmset("user", map);
//hmget 取值,多条数据
List<String> hmget = jedis.hmget("user", "name", "age");
hmget.forEach(e -> System.out.println(e));
//hgetALl 取值,获取整个hash
Map<String, String> map1 = jedis.hgetAll("user");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + "---->" + entry.getValue());
}
//hdel 删除
jedis.hdel("user", "address", "age");
}
....
2.lettuce连接Redis
添加依赖
<!--redis 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置文件
spring:
redis:
# Redis服务器地址
host: 192.168.10.100
# Redis服务器端口
port: 6379
# Redis服务器端口
password: root
# Redis服务器端口
database: 0
# 连接超时时间
timeout:10000ms
lettuce:
pool:
# 最大连接数,默认8
max-active: 1024
# 最大连接阻塞等待时间,单位毫秒,默认-1ms
max-wait: 10000ms
# 最大空闲连接,默认8
max-idle: 200
# 最小空闲连接,默认0
min-idle: 5
redis连接
/**
\* Redis配置
*/
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory){
RedisTemplate<String,Object> redisTemplate=new RedisTemplate<>();
//为string类型key设置序列器
redisTemplate.setKeySerializer(new StringRedisSerializer());
//为string类型value设置序列器
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
//为hash类型key设置序列器
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
//为hash类型value设置序列器
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setConnectionFactory(redisConnectionFactory);
return redisTemplate;
}
操作数据
/**
\* string操作
*/
@Test
public void testString(){
ValueOperations<String,Object> stringObjectValueOperations=redisTemplate.opsForValue();
//设置,单条数据
stringObjectValueOperations.set("name","zhangsan");
//取值,单条数据
String name= (String) stringObjectValueOperations.get("name");
//设置,多条数据
Map<String,String> map=new HashMap<>();
map.put("age","20");map.put("address","jx");
stringObjectValueOperations.multiSet(map);
//取值 多条数据
List<String> keys=new ArrayList<>();
keys.add("name");
keys.add("age");
keys.add("address");
List<Object> list = stringObjectValueOperations.multiGet(keys);
list.forEach(System.out::println);
//层级目录
stringObjectValueOperations.set("user:01","yangyang");
}
.....
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/121441.html