1.简介
为了解决高并发、高可用、高可扩展,大数据存储等一系列问题而产生
的数据库解决方案,就是NoSql。redis为其产品Redis是使用c语言开发的一
个高性能键值数据库。Redis可以通过一些键值类型来存储数据。
key-value ,即使断电也不会丢失数据,主要 用来做缓存数据库和web集群时
当做中央缓存存放session,内存级别的缓存操作很快
把经常需要查询的,很少修改数据,放到读速度很快的空间(内存)以便减少
访问数据库的时间,减轻压力,减少访问时间
redis中的计数器是原子性的内存操作,可以解决库存溢出的问题。
用处:中央缓存,!!!
redis对象保存方式?
json字符串
需要把对象转换成json字符串,当做字符串处理,直接set,get来设置
优点:设置获取比较简单 ,少量数据用
缺点:没有提供专门的方法需要手动转换
字节:
需要做序列化,就是把对象序列化字节保存,百万大数据用
redis数据淘汰机制
内存有限,需要保存有效的数据,redis内存数据集大小上升到一定
大小时就会施行数据淘汰策略,redis提供6中策略
volatile-lru:从以设置过期时间的数据集,中挑选最近最少使用的淘汰
allkeys-lru: 从数据及中挑选最近最少使用的数据淘汰。
java访问Redis
使用jedis java客户端来访问redis服务器,类似于jdbc访问mysql一样
Spring data也可以 相当于jedis二次封装
redis具有事务的特性
2.导入jar包
<!-- Redis客户端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.2</version>
</dependency>
2.spring整合redis service层配置文件
<!-- 访问单机版redis,创建RedisPool对象 -->
<bean id="jedisPoolId" class="redis.clients.jedis.JedisPool">
<constructor-arg name="host" value="10.0.129.80"></constructor-arg>
<constructor-arg name="port" value="6379"></constructor-arg>
</bean>
<bean class="com.util.redis.JedisPoolClient">
<property name="jedisPool" ref="jedisPoolId"></property>
</bean>
<!-- 集群 -->
<bean class="com.util.redis.JedisClusterClient">
<property name="jedisCluster" ref="jedisClusterId"></property>
</bean>
<!-- 访问redis集群,创建JedisCluster对象 -->
<bean id="jedisClusterId" class="redis.clients.jedis.JedisCluster">
<constructor-arg name="nodes">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="10.0.129.80"></constructor-arg>
<constructor-arg name="port" value="6379"></constructor-arg>
</bean>
...
...
...
</set>
</constructor-arg>
</bean>
3.redis单机版和集群版公共实现的接口
public interface JedisClient {
String set(String key,String value);
String get(String key);
Long del(String key);
Boolean exists(String key);
Long hset(String key,String field,String value);
String hget(String key,String field);
Long hdel(String key,String... field);
Boolean hexists(String key,String field);
List<String> hvals(String key);
Long expire(String key,int seconds);
Long ttl(String key);
Long incr(String key);
}
4.分别实现单机版实现类和集群版实现类
集群版
public class JedisClusterClient implements JedisClient {
private JedisCluster jedisCluster;
...
...
}
单机版
public class JedisPoolClient implements JedisClient{
private JedisPool jedisPool;
}
4.从redis中取数据
@Autowired //单机版和集群版公共实现的接口(自己写)
JedisClient jedisClient
//在redis中取数据
String json = jedisClient.get(ITEM_REDIS_KEY+":"+itemId+":BASE");
if (StringUtils.isNotBlank(json)) {
TbItem item=JsonUtils.jsonToPojo(json, TbItem.class);
return item;
}
//向redis中存数据
TbItem item = mapper.selectByPrimaryKey(itemId);
if (item!=null) {
jedisClient.set(ITEM_REDIS_KEY+":"+itemId+":BASE",JsonUtils.objectToJson(item));
jedisClient.expire(ITEM_REDIS_KEY+":"+itemId+":BASE", ITEM_REDIS_EXPIRE);
}
为了解决高并发、高可用、高可扩展,大数据存储等一系列问题而产生
的数据库解决方案,就是NoSql。redis为其产品Redis是使用c语言开发的一
个高性能键值数据库。Redis可以通过一些键值类型来存储数据。
key-value ,即使断电也不会丢失数据,主要 用来做缓存数据库和web集群时
当做中央缓存存放session,内存级别的缓存操作很快
把经常需要查询的,很少修改数据,放到读速度很快的空间(内存)以便减少
访问数据库的时间,减轻压力,减少访问时间
redis中的计数器是原子性的内存操作,可以解决库存溢出的问题。
用处:中央缓存,!!!
redis对象保存方式?
json字符串
需要把对象转换成json字符串,当做字符串处理,直接set,get来设置
优点:设置获取比较简单 ,少量数据用
缺点:没有提供专门的方法需要手动转换
字节:
需要做序列化,就是把对象序列化字节保存,百万大数据用
redis数据淘汰机制
内存有限,需要保存有效的数据,redis内存数据集大小上升到一定
大小时就会施行数据淘汰策略,redis提供6中策略
volatile-lru:从以设置过期时间的数据集,中挑选最近最少使用的淘汰
allkeys-lru: 从数据及中挑选最近最少使用的数据淘汰。
java访问Redis
使用jedis java客户端来访问redis服务器,类似于jdbc访问mysql一样
Spring data也可以 相当于jedis二次封装
redis具有事务的特性
2.导入jar包
<!-- Redis客户端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.2</version>
</dependency>
2.spring整合redis service层配置文件
<!-- 访问单机版redis,创建RedisPool对象 -->
<bean id="jedisPoolId" class="redis.clients.jedis.JedisPool">
<constructor-arg name="host" value="10.0.129.80"></constructor-arg>
<constructor-arg name="port" value="6379"></constructor-arg>
</bean>
<bean class="com.util.redis.JedisPoolClient">
<property name="jedisPool" ref="jedisPoolId"></property>
</bean>
<!-- 集群 -->
<bean class="com.util.redis.JedisClusterClient">
<property name="jedisCluster" ref="jedisClusterId"></property>
</bean>
<!-- 访问redis集群,创建JedisCluster对象 -->
<bean id="jedisClusterId" class="redis.clients.jedis.JedisCluster">
<constructor-arg name="nodes">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="10.0.129.80"></constructor-arg>
<constructor-arg name="port" value="6379"></constructor-arg>
</bean>
...
...
...
</set>
</constructor-arg>
</bean>
3.redis单机版和集群版公共实现的接口
public interface JedisClient {
String set(String key,String value);
String get(String key);
Long del(String key);
Boolean exists(String key);
Long hset(String key,String field,String value);
String hget(String key,String field);
Long hdel(String key,String... field);
Boolean hexists(String key,String field);
List<String> hvals(String key);
Long expire(String key,int seconds);
Long ttl(String key);
Long incr(String key);
}
4.分别实现单机版实现类和集群版实现类
集群版
public class JedisClusterClient implements JedisClient {
private JedisCluster jedisCluster;
...
...
}
单机版
public class JedisPoolClient implements JedisClient{
private JedisPool jedisPool;
}
4.从redis中取数据
@Autowired //单机版和集群版公共实现的接口(自己写)
JedisClient jedisClient
//在redis中取数据
String json = jedisClient.get(ITEM_REDIS_KEY+":"+itemId+":BASE");
if (StringUtils.isNotBlank(json)) {
TbItem item=JsonUtils.jsonToPojo(json, TbItem.class);
return item;
}
//向redis中存数据
TbItem item = mapper.selectByPrimaryKey(itemId);
if (item!=null) {
jedisClient.set(ITEM_REDIS_KEY+":"+itemId+":BASE",JsonUtils.objectToJson(item));
jedisClient.expire(ITEM_REDIS_KEY+":"+itemId+":BASE", ITEM_REDIS_EXPIRE);
}