1.概念
redis是C语言开发的, redis基于内存的数据库(数据存储到了内存当中), redis中数据的存储是以KEY-VALUE的形式来存储,redis中也是有丰富的数据类型
2.特点
- redis将数据存储到内存当中, redis的读写效率非常高: 读 11万/s 写 8万/s
- redis中提供了丰富的数据类型: 五种 String hash list set sortedSet
- 注意: redis中数据类型指的是value的数据类型,而key只有String
- redis支持快捷移植数据,
- redis操作都是原子性的,用来保证数据的完整性
3. redis的数据类型的使用场景
- String(字符串):
- 特点: 和java中String是类似的, 表示字符串
- get;set;mget;mset;getrange;strlen;incr ;decr;incrby;decryby
- 使用场景: 做缓存 计数器 点赞
- hash(散列):
- 特点: 和java中hashmap是类似的,
- hset;hget;hkeys,hlen,hdel
- 使用场景: 做缓存(一般可以被String所替代)
- list(列表):
- 特点: 和 java中linkedList类似,看做一个队列(FIFO)
- lpush,rpush,lrange,lpop,rpop,llen,lindex
- 使用场景: 模拟队列 栈 朋友圈点赞
- set(集合):
- 特点: 和java中set集合类型: 去重 无序
- sadd,smembers,spop,srandmember,sismember
- 使用场景: 去重操作 抽奖
- sortedSet(有序集合):
- 特点: 去重 有序
- zadd,zrange,zrevrange,zscore(查看元素的的分值),zrangebyscore,zrank,
- 使用场景: 排序(排行榜)
keys的命令:del,exists,keys
4.安装
链接:https://pan.baidu.com/s/1EQ26tDdzXCiMOe9tgOwTWQ
提取码:jhfb
傻瓜式安装
5.jedis
jedis就是一款java连接redis的客户端工具, jedis中操作API与redis中命令是一样的,大大降低了学习成本,jedis也是redis官方推荐的一款java客户端工具
如果想jedis, 就需要先进行导包:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
基本入门程序(添加测试依赖)
@Test
public void testIndexJedis(){
//1.创建一个jedis对象
Jedis jedis = new Jedis("127.0.0.1", 6379);
//2.测试是否连通
String pong = jedis.ping();
System.out.println(pong);
//关闭
jedis.close();
}
(1) jedis操作redis -->String
@Test
public void testString() throws Exception{
//1.创建一个jedis对象
Jedis jedis = new Jedis("127.0.0.1", 6379);
//2.执行相关的操作:String
//2.1赋值
jedis.set("age","24");
//2.2取值
String age = jedis.get("age");
System.out.println(age);
//2.3想让age+1操作
Long age1 = jedis.incr("age");
System.out.println(age1);
//2.4想让age-1操作
Long age2 = jedis.decr("age");
System.out.println(age2);
//2.5想让age只存活5秒,到时间后销毁即可
jedis.expire("age",5);
while(jedis.exists("age")){
Long time = jedis.ttl("age");//以秒为单位,返回给定 key 的剩余生存时间
System.out.println(time);
Thread.sleep(1000);
}
//2.6新创建name的时候,为name添加有效时长为5秒
jedis.setex("name",5,"哆啦A梦");
while(jedis.exists("name")){
Long time = jedis.ttl("name");
System.out.println(time);
Thread.sleep(1000);
}
//2.7删除一个key
jedis.del("name");
System.out.println(jedis.get("name"));//null
}
(2)jedis操作redis --> list
@Test
public void testList(){
//1.创建一个jedis对象
Jedis jedis = new Jedis("127.0.0.1", 6379);
//2.相关操作:list
//2.1从左侧添加元素,从右侧弹出元素
//注意,不要出现从左侧添加,从左侧弹出
jedis.lpush("list1","a","b","c","d");
String rpop = jedis.rpop("list1");
System.out.println(rpop);
//2.2遍历list集合
List<String> list = jedis.lrange("list1", 0, -1);
System.out.println(list);
//2.3获取列表的个数
Long len = jedis.llen("list1");
System.out.println(len);
//2.4从右侧弹出一个元素,将弹出的元素从左侧添加
jedis.rpoplpush("list1","list1");
list = jedis.lrange("list1",0,-1);
System.out.println(list);
}
(3)jedis操作redis --> set
@Test
public void testSet(){
//1.创建一个jedis对象
Jedis jedis = new Jedis("127.0.0.1", 6379);
//2.相关操作:set
//2.1添加数据
jedis.sadd("set1","q","w","e","r","e");
//2.2获取set集合所有的元素
Set<String> set1 = jedis.smembers("set1");
System.out.println(set1);//[e, w, r, q]
//2.3判断w是否存在
Boolean flag = jedis.sismember("set1", "w");
System.out.println(flag);
//2.4获取set集合中数量
Long len = jedis.scard("set1");
System.out.println(len);
}
6. jedis中连接池
@Test
public void testJedisPool() throws Exception{
//1.创建连接池对象
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50);
config.setMaxIdle(20);//最大的闲时连接
config.setMinIdle(5);//最小的闲时连接
/*
* 第一个参数:连接池的配置对象
* 第二个参数:主机名
* 第三个参数:端口号
* */
JedisPool jedisPool = new JedisPool(config, "127.0.0.1", 6379);
//2.获取连接
Jedis jedis = jedisPool.getResource();
//3.测试
System.out.println(jedis.ping());
//4.关闭
jedis.close();
}
抽取工具类
public class JedisUtil {
private static JedisPool jedisPool;
//静态代码块:
static {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50);
config.setMaxIdle(20); // 最大的闲时连接
config.setMinIdle(5); // 最小的闲时连接
jedisPool = new JedisPool(config,"127.0.0.1",6379);
}
//获取连接
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
@Test
public void testJedisUtil(){
Jedis jedis = JedisUtil.getJedis();
System.out.println(jedis.ping());
jedis.close();
}
7.Mybatis整合Redis
二级缓存回顾
1、添加依赖
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
<!--mybatis整合redis-->
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-redis</artifactId>
<version>1.0.0-beta2</version>
</dependency>
</dependencies>
2、实体类
public class User implements Serializable{
private Integer id;
private String name;
private Integer age;
private Date birthday;
private BigDecimal salary;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", birthday=" + birthday +
", salary=" + salary +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public BigDecimal getSalary() {
return salary;
}
public void setSalary(BigDecimal salary) {
this.salary = salary;
}
}
3、工具类
public class MyBatisUtils {
private static SqlSessionFactory factory = null;
static{
String resource = "Mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
factory = new SqlSessionFactoryBuilder().build(inputStream);
}
public static SqlSession getSession(){
return factory.openSession();
}
}
4、mapper接口
public interface UserMapper {
User get(Integer id);
}
5、mapper映射文件
<mapper namespace="com.xj.cache.mapper.UserMapper">
<cache/>
<select id="get" resultType="com.xj.cache.bean.User">
select * from user where id = #{id}
</select>
</mapper>
6、主配置文件
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/Mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/xj/cache/mapper/UserMapper.xml"/>
</mappers>
7、日志文件
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.xj.cache=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
8、测试类
public class App {
@Test
public void testCache() throws Exception{
SqlSession session = MyBatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.get(1);
session.close();
System.out.println(user);
System.out.println("===========");
SqlSession session2 = MyBatisUtils.getSession();
UserMapper mapper2 = session2.getMapper(UserMapper.class);
User user2 = mapper2.get(1);
session.close();
System.out.println(user2);
}
}
Mybatis整合Redis
1、添加依赖
<!--mybatis整合redis-->
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-redis</artifactId>
<version>1.0.0-beta2</version>
</dependency>
2、修改映射文件中添加的<cache>标签
<cache type="org.mybatis.caches.redis.RedisCache"/>
如果想更改默认配置,可以在资源文件中添加一个配置文件,例如,想更改数据库(默认存在0)
database=1
运行测试类,切换到数据库1
7.使用json缓存对象
1、添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
2、自定义类
public class MyCache implements Cache {
private String id;
public MyCache(String id){
this.id = id;
}
public String getId() {
return id;
}
public void putObject(Object key, Object value) {
Jedis jedis = JedisUtil.getJedis();
jedis.hset(id.toString().getBytes(),key.toString().getBytes(), JSON.toJSONString(value).getBytes());
jedis.close();
}
public Object getObject(Object key) {
Jedis jedis = JedisUtil.getJedis();
byte[] res = jedis.hget(id.toString().getBytes(), key.toString().getBytes());
if(res == null){
return null;
}
String jsonString = new String(res);
List<User> users = JSON.parseArray(jsonString, User.class);
jedis.close();
return users;
}
public Object removeObject(Object key) {
Jedis jedis = JedisUtil.getJedis();
Long hdel = jedis.hdel(id.toString().getBytes(), key.toString().getBytes());
jedis.close();
return hdel;
}
public void clear() {
Jedis jedis = JedisUtil.getJedis();
Long hdel = jedis.hdel(id.toString().getBytes());
jedis.close();
}
public int getSize() {
return 0;
}
public ReadWriteLock getReadWriteLock() {
return null;
}
}
3、修改配置文件文件中的<cache>标签
<cache type="com.xj.cache.jsoncache.MyCache"/>