redis中的数据一共五种数据类型:
- string(字符串类型 )
- hash类型(散列类型)
- list类型(列表类型)
- set (无序集合类型)
- zset(有序集合类型)
---------------------------------
string字符串类型:
set(key,value)-------存储数据
get(key)-------------取数据
mset(k1 v1 k2 v2)-------------同时存储多个键值对
mget(k1 k2)-------------------同时取得多个值
exists(key)--------------------判断是否存在某一个键
- 在redis中,返回的是0,1 (0:不存在,1:存在)
- 在jedis中,返回的是true,false
strlen key--------------------判断键对应的值的字符长度
incr key ------------------在当前值上+1(值为数值才可以)
incrby key 3 ------------------在当前值上+3(值为数值才可以)
decr key------------------------在当前值上-1
decrby key 3------------------------在当前值上-3
string类型,一个键,对应一个值
string类型的数据,在存储时,如果key的名称相同,后面的值,将会覆盖之前的值
---------------------------------------------------------------------------------------------------
hash (散列类型)
hset 键 字段 值 --------------------存储一个hash类型的数据,一个键中包含一个字段,以及对应的值
- hset stu id 1
- hset stu name jack
- hset stu score 98
在使用hash类型存储数据时,如果键相同,字段名不同,它不会覆盖,只是给当前键,追加新的字段
hget 键 字段 ---------------------获得键中某一个字段的值
hmset 键 字段1 值1 字段2 值.... --------------给一个键,一次存储多个字段
- 示例: hmset stu id 1 name jack score 98
hmget 键 字段1 字段2 字段3 -----------------一次获取多个字段值
hgetall 键 --------------获取所有字段值
hdel key 字段1 字段2----------可以删除一个或多个字段,返回值是被删除的字段个数
HEXISTS key 字段-----------------判断key中,是否包含某一个字段
HKEYS key ----------获得键中,所有的字段名
HVALS key------------获得键中,所有字段对应的值
HLEN key-------------获得当前键中,包含几个字段
---------------------------------------------------------------------------------------------
list 列表类型
这种列表是一种链表结构
- 特点:允许存在重复数据,它存储数据时,是从两头存放
lpush 键名 a b c ----------------------添加一个列表,数据从左至右添加
rpush 键名 1 2 3---------------------向列表中添加数据,从右至左
lrange 键 0 -1-------------------------查看列表中的全部数据
LPOP key---------------------------从列表的左侧获得一个元素(取一个就会少一个)
RPOP key---------------------------从列表的右侧获得一个元素(取一个就会少一个)
LLEN key-----------------------------获得列表中的个数
---------------------------------------------------------------------------------------
set 无序集合
特点:
- 不能有重复数据
- 数据是无序排序
sadd 键 a b c -----------------向集合存放数据
smembers 键---------------------取得集合中的全部数据
SISMEMBER 键 值----------------判断键所对应的集合是否存在某一个值
SPOP key------------------------从集合中随机弹出一个元素(弹出一个就会少一个)
- 应用场景:随机抽奖,每一个人员只有一次机会
zset 有序集合
特点:
- 不能有重复数据
- 数据是有序排序
- 它在存储数据时,需要给每个元素指定一个分数,然后按分数进行排序
添加的数据
- zadd 键 分数 元素1 分数 元素2
- 示例: zadd zset1 98 andy 99 chris 97 bruce
查看全部数据(不显示分数) 默认是升序排序
- ZRANGE 键 0 -1
查看全部数据(显示分数) 默认是升序排序
- ZRANGE 键 0 -1 withscores
查看全部数据(显示分数) 默认是降序排序
- zrevRANGE 键 0 -1 withscores
----------------------------------------------------------------------------------------------------------------------
所有数据类型,都可以使用的方法
del 键 ---------------------------删除数据
flushall ------------------------清空所有键
keys * ---------------------------查看包含有哪些key
type 键 --------------------------查看当前的数据类型
exits 键--------------------------判断键是否存在
expire 键 秒----------------设置某一个key在redis中的存活时间 (如果不做设置,该键永远存在)
ttl 键 ---------------------------查看当前键,剩余的存活时间(秒)
----------------------------------------------------------------------------------------------------------------------
为什么要用redis?
答:项目使用 redis,数据可以存放缓存中,这样可以避免频繁访问数据库,减少频繁访问数据库给服务器的压力,这样可以缓解高并发环境下服务器承受的过大压力
项目中使用redis的步骤:
1、导入测试的示例(不存在redis的配置)
2、导入依赖
<!--jedis依赖-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.0</version>
</dependency>
<!--配置连接池的依赖-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.3</version>
</dependency>
<!--导入jackson的三个依赖-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.7.0</version>
</dependency>
2、编写redis的配置文件
<!--配置redis连接池的配置信息-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="minIdle" value="50"/>
<property name="maxIdle" value="200"/>
<property name="maxTotal" value="1000"/>
<property name="maxWaitMillis" value="3000"/><!--最大等待时间-->
<property name="softMinEvictableIdleTimeMillis" value="10000"/><!--闲置连接超过上限,10秒后,将多余连接销毁-->
</bean>
<!--配置连接池-->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<property name="poolConfig" ref="jedisPoolConfig"/>
<property name="host" value="192.168.112.137"/>
<property name="port" value="6379"/>
</bean>
3、在web.xml文件中,加载spring配置文件
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext*.xml</param-value>
</init-param>
</servlet>
4、编写redis的接口,包含一些常规方法
public void set(String key,String value);
public String get(String key);
public void hset(String key,String field,String value);
public String hget(String key,String field);
public void del(String key);
5、编写redis接口的实现类
@Autowired
private JedisPool jedisPool;
@Override
public void set(String key, String value) {
//通过连接池,获得Jedis对象
Jedis jedis = jedisPool.getResource();
jedis.set(key,value);
jedis.close();
}
@Override
public String get(String key) {
Jedis jedis = jedisPool.getResource();
String value = jedis.get(key);
jedis.close();
return value;
}
@Override
public void hset(String key, String field, String value) {
Jedis jedis = jedisPool.getResource();
jedis.hset(key,field,value);
jedis.close();
}
@Override
public String hget(String key, String field) {
Jedis jedis = jedisPool.getResource();
String value = jedis.hget(key, field);
jedis.close();
return value;
}
@Override
public void del(String key) {
Jedis jedis = jedisPool.getResource();
jedis.del(key);
jedis.close();
}
6、导入json工具类,用于解析json
package org.java.util;
import java.util.List;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonUtils {
private static final ObjectMapper MAPPER = new ObjectMapper();
/**
*
* <p>Title: pojoToJson</p>
* <p>Description: </p>
* @param data
* @return
*/
public static String objectToJson(Object data) {
try {
String string = MAPPER.writeValueAsString(data);
return string;
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {
try {
T t = MAPPER.readValue(jsonData, beanType);
return t;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static <T>List<T> jsonToList(String jsonData, Class<T> beanType) {
JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
try {
List<T> list = MAPPER.readValue(jsonData, javaType);
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
- 可以将对象、集合转换成json,方便存储到redis
- 可以将redis的json数据,还原成对象、集合在页面中呈现
7、在service层(业务层),在查询数据库之前,首先判断redis中有没有数据,如果有,就直接返回redis的数据,不再查询数据库。如果没有,就查询数据库,并且将查询到的结果,放在redis中
package org.java.service.impl;
import org.java.dao.PrdMapper;
import org.java.entity.Prd;
import org.java.redis.RedisClient;
import org.java.service.PrdService;
import org.java.util.JsonUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.List;
@Service
public class PrdServiceImpl implements PrdService {
@Autowired
private PrdMapper mapper;
@Autowired//注入redis接口
private RedisClient redisClient;
@Override
public List<Prd> getList() {
//首先判断redis中有没有需要数据
String json = redisClient.hget("redis_j54_singleton", "getList");
//判断是否存在数据
if(StringUtils.isEmpty(json)){
System.out.println("==================数据来自至于database============");
//redis没有缓存,准备查询关系型数据库
List<Prd> list = mapper.getList();
//将集合序列化成json格式的字符串
json = JsonUtils.objectToJson(list);
//将查询到的结果,存放到缓存中
redisClient.hset("redis_j54_singleton","getList",json);
return list;
}else{
System.out.println("==================数据来自至于redis============");
//有缓存数据,可以将json数据,转换成集合
List<Prd> list = JsonUtils.jsonToList(json, Prd.class);
return list;
}
}
@Override
public Prd findById(String pid) {
//判断缓存中是否存在数据
String json = redisClient.hget("redis_j54_singleton",pid);
if(StringUtils.isEmpty(json)){
//缓存中不存在,准备查询数据库
System.out.println("==================数据来自至于database============"+pid);
Prd prd = mapper.findById(pid);
//将对象,存放到缓存
json = JsonUtils.objectToJson(prd);
redisClient.hset("redis_j54_singleton",pid,json);
return prd;
}else{
System.out.println("==================数据来自至于redis============"+pid);
//缓存中存在
//将json转换成PRD
Prd prd = JsonUtils.jsonToPojo(json, Prd.class);
return prd;
}
}
}