浅谈redis数据库

Redis数据库
1、Redis数据库介绍
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
主要用作缓存使用。服务器一旦关闭保存在里面的数据如果没有进行手动的持久化保存,将会自动清除。
Redis 与其他 key - value 缓存产品有以下三个特点:
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
Window 下安装
下载地址:https://github.com/MSOpenTech/redis/releases
Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip压缩包到 C 盘,解压后,将文件夹重新命名为 redis。

打开文件夹,内容如下:

打开一个 cmd 窗口 使用 cd 命令切换目录到 C:\redis 运行:
redis-server.exe redis.windows.conf
启动服务器

可以把 redis 的路径加到系统的环境变量里,这样就省得再输路径了,后面的那个 redis.windows.conf 可以省略,如果省略,会启用默认的。输入之后,会显示如下界面:
将redis的路径配置到path环境变量中。
直接将解压的路径配置就可以了redis-server.exe
启动客户端进行redis的操作,双击redis-cli.exe

redis-cli -p 6379 ip地址 或者 redis-cli -h -p 6379连接redis服务器。

设置服务命令 必须进到redis的解压文件的目录
redis-server.exe --service-install redis.windows-service.conf --loglevel verbose
将redis加载到本机服务中就不用每一次都要开启redis服务了
在我们的redis的安装位置加上一个logs文件夹,用来保存我们的redis服务的所有执行信息。否则服务无法正常开启
输入命令之后没有报错,表示成功了,刷新服务,会看到多了一个redis服务。

如何你的redis服务之前已经安装到服务中,再次加载的时候记得将注册表中的redis信息删除。
2、常用的redis服务命令。 https://www.runoob.com/redis/redis-sets.html借助于菜鸟中的字典
卸载服务:redis-server --service-uninstall
开启服务:redis-server --service-start
停止服务:redis-server --service-stop

设置redis权限密码 config set requirepass 密码 如果要去掉密码就把密码设置为“”,注意此设置服务器启动之后密码就失效了
redis-cli -h host -p port -a password host是ip port 是端口 6379
设置永久密码
修改redis的配置文件

修改之后一定要重启服务器 requirepass 123456

2.1 设置允许使用外网访问

2.2 Redis数据库的基本命令
在进入到redis客户端之后 info 可以查看当前redis的相关信息
flushdb // 清除当前数据库的所有keys
flushall // 清除所有数据库的所有keys
config get databases查看有多少数据库
Select 下标 切换数据库

1)添加String 数据
Set key value key不能重复
Get key 根据key值获取value值
Del key 根据指定的key值来删除对应的value值
在进行set存值的时候如果想添加中文 可以将自己的dos窗口设置编码(chcp查询当前编码 chcp 936 65001 ), 在连接redis服务器的时候使用 redis-cli – raw 设置支持中文显示 就可以进行中文的查询显示
2)添加hash 值
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)
Hmset key的名字 字段名 value …
Hmset student name zhangsan
Hget student name 查看student表示的对象的name值
Hgetall student 查询student对象表示所有属性

3)添加列表 list
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
Lpush key value 可以多次使用同一个key进行进行多次添加,就相当于java的list集合。Lpush就是每一次给集合的第一个位置添加元素rpush就是每一次给后面的元素添加值
LRANGE key start stop 获取列表指定范围内的元素
LREM key count value 移除列表元素
RPOP key 移除列表的最后一个元素,返回值为移除的元素

4)添加set集合
Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。该set与java中的set的特点一致
SADD runoobkey mysql 以set的形式添加数据
SADD runoobkey mysql
SMEMBERS runoobkey

5)添加有序集合zset
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
ZADD runoobkey 1 redis
ZRANGE runoobkey 0 10 WITHSCORES

2.3 订阅发布
当关注之后就可以自动获取到关注的对象发布的消息
SUBSCRIBE redisChat 订阅某个频道

PUBLISH redisChat 内容 在公众号发布消息

2.4 Expire 设置失效时间
SET xingyun “www.xingyun.com” 创建key和value
Get xingyun 根据key获取value
EXPIRE xingyun 30 # 设置过期时间为 30 秒 设置成功返回 1 。
TTL cache_page # 查看剩余生存时间
2.5 Redis 支持事务操作:但是全部默认提交
事务是将多条语句当做件事情,无论中间是否出现错误 其他语句都会正常执行
Redis的事务的具体操作
开启事务 multi
编写语句 执行语句 set get sadd
开始执行 exec

事务回滚 进行监听 通过监听key的值的改变来进行事务的回滚
如果监控的key的值发生改变 当前事务就会回滚

3、redis的数据备份与回复
Save 持久化保存数据 如果没有持久化保存数据 服务器关闭之后数据就会自动清空 使用save命令就会将数据保存在redis的安装路径中创建dump.rdb文件。 永久保存
使用config get dir 查看redis的安装路径
如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可
bgsave:将数据异步保存到磁盘
shutdown:将数据同步保存到磁盘,然后关闭服务

4、java操作redis数据库
Java程序连接使用redis数据库
首先你需要下载驱动包 下载 jedis.jar,确保下载最新驱动包。
创建java项目加载驱动架包,使用Jedis类进行操作,
import redis.clients.jedis.Jedis; //导入jedis
public class RedisJava {
public static void main(String[] args) {
//连接本地的 Redis 服务
Jedis jedis = new Jedis(“localhost”);
System.out.println(“连接成功”);
//查看服务是否运行
System.out.println("服务正在运行: "+jedis.ping()); } }
在new Jedis的时候 需要传入一个ip地址
//默认参数host,port,timeout,可以只写host
Jedis jedis = new Jedis(RedisIP, RedisPORT);//创建连接
Java连接到Redis服务器
请参考以下一个简单的示例代码 -
import redis.clients.jedis.Jedis;
public class RedisJava {
public static void main(String[] args) {
//Connecting to Redis server on localhost
Jedis jedis = new Jedis(“localhost”);
System.out.println(“Connection to server sucessfully”);
//check whether server is running or not
System.out.println("Server is running: "+jedis.ping());
} }

现在,编译并运行上面的程序来测试与Redis服务器的连接。可以根据需要更改路径。假设jedis.jar的当前版本在当前路径中可以使用。
执行上面代码,将生成以下结果 -
$javac RedisJava.java
$java RedisJava
Connection to server sucessfully
Server is running: PONG
Redis Java字符串示例
import redis.clients.jedis.Jedis;
public class RedisStringJava {
public static void main(String[] args) {
//Connecting to Redis server on localhost
Jedis jedis = new Jedis(“localhost”);
System.out.println(“Connection to server sucessfully”);
//set the data in redis string
jedis.set(“tutorialname”, “Redis tutorial”);
// Get the stored data and print it
System.out.println("Stored string in redis:: "+ jedis.get(“tutorialname”));
} }

Java
执行上面代码,将生成以下结果 -
$javac RedisStringJava.java
$java RedisStringJava
Connection to server sucessfully
Stored string in redis:: Redis tutorial
Java
Redis Java列表示例
import redis.clients.jedis.Jedis;
public class RedisListJava {
public static void main(String[] args) {
//Connecting to Redis server on localhost
Jedis jedis = new Jedis(“localhost”);
System.out.println(“Connection to server sucessfully”);

  //store data in redis list 
  jedis.lpush("tutorial-list", "Redis"); 
  jedis.lpush("tutorial-list", "Mongodb"); 
  jedis.lpush("tutorial-list", "Mysql"); 
  // Get the stored data and print it 
  List<String> list = jedis.lrange("tutorial-list", 0 ,5); 

  for(int i = 0; i<list.size(); i++) { 
     System.out.println("Stored string in redis:: "+list.get(i)); 
  } 

} }

Java
执行上面代码,将生成以下结果 -
$javac RedisListJava.java
$java RedisListJava
Connection to server sucessfully
Stored string in redis:: Redis
Stored string in redis:: Mongodb
Stored string in redis:: Mysql
Java
Redis Java键示例
import redis.clients.jedis.Jedis;
public class RedisKeyJava {
public static void main(String[] args) {
//Connecting to Redis server on localhost
Jedis jedis = new Jedis(“localhost”);
System.out.println(“Connection to server sucessfully”);
//store data in redis list
// Get the stored data and print it
List list = jedis.keys("*");

  for(int i = 0; i<list.size(); i++) { 
     System.out.println("List of stored keys:: "+list.get(i)); 
  } 

} }

还可以使用连接池技术获取jedis
JedisPool pool = new JedisPool(new JedisPoolConfig(), “localhost”);
Jedis jedis = pool.getResource();

maxWait 连接池中连接用完时,新的请求等待时间,毫秒
timeBetweenEvictionRunsMillis timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis一起使用,每

timeBetweenEvictionRunsMillis毫秒秒检查一次连接池中空闲的连接,把空闲时间超过minEvictableIdleTimeMillis毫秒的连接断开,直到连接池中的连接数到minIdle为止

minEvictableIdleTimeMillis 连接池中连接可空闲的时间,毫秒

removeAbandoned true,false,是否清理removeAbandonedTimeout秒没有使用的活动连接,清理后并没有放回连接池
removeAbandonedTimeout 活动连接的最大空闲时间
logAbandoned true,false,连接池收回空闲的活动连接时是否打印消息

minEvictableIdleTimeMillis,removeAbandonedTimeout这两个参数针对的连接对象不一样,minEvictableIdleTimeMillis针对连接池中的连接对象,removeAbandonedTimeout针对未被close的活动连接.

Jedis的常用方法

5、使用redis结合mysql数据库进行操作
当查找数据的时候使用redis数据库的数据先进行比对,如果有合适的数据就直接使用,就不进行mysql数据库的查询操作,如果redis中没有需要的数据在进行mysql数据库的操作,并将需要的数据保存到redis中

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
import java.util.Set;

import redis.clients.jedis.Jedis;

public class RedisTest {

String name;
String psw;

public static void main(String[] args) {
	Scanner input = new Scanner(System.in);
	System.out.println("请输入你的用户名");
	String inname=input.nextLine();
	System.out.println("请输入你的密码");
	String pw=input.nextLine();
	//连接redis数据库
	Jedis jd = new Jedis("127.0.0.1",6379);
	//用输入的用户名与redis数据库中的key比较
	String n = jd.get(inname);
	System.out.println(n);
	//如果n等于null   表示redis数据库中现在没有数据
	if(n==null) {
		RedisTest user = getUser(inname,pw);
		if(user.name==null) {
			System.out.println("你输入的用户名或者密码有问题");
		}else {
			System.out.println("登录成功111");
            //将从数据库查询到的数据保存到redis中
			jd.set(user.name, user.psw);
		}
		
	}else {//如果不等于null就表示redis中有该用户 判断密码    
		if(pw.equals(n)) {
			System.out.println("登录成功2222");
		}
	}
	
	

}

//连接mysql数据库 进行用户名和密码的查找
//如果找到就保存到redis中   
public static  RedisTest getUser(String username,String password) {
	System.out.println("调用mysql数据库");
	RedisTest u=new RedisTest();
	try {
		//加载数据库驱动
		Class.forName("com.mysql.jdbc.Driver");
		//获取数据库连接
		Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/redis?characterEncoding=utf-8", "root", "mysql");
		//预编译sql语句   使用通配符
		PreparedStatement ps = connection.prepareStatement("select * from user where user_name=? and password=?");
		//为sql语句赋值
		ps.setString(1, username);
		ps.setString(2, password);
		//执行sql语句
		ResultSet result = ps.executeQuery();
		//创建一个对象用来保存从数据库查询到的数据
		
		while(result.next()) {
			String name =result.getString("user_name");
			String psw=result.getString("password");
			if(username.equals(name) && password.equals(psw)) {
				u.name=name;
				u.psw=psw;
			}
		}
		
	} catch (ClassNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}   
	
	return u;
}

}

6、使用java实现redis的消息通知和订阅
6.1 创建一个类用来监听消息的状态 通过继承JedisPubSub

import redis.clients.jedis.JedisPubSub;

public class RedisMsgPubSubListener extends JedisPubSub {
@Override
public void unsubscribe() {
super.unsubscribe();
}

@Override
public void unsubscribe(String… channels) {
super.unsubscribe(channels);
}

@Override
public void subscribe(String… channels) {
super.subscribe(channels);
}
@Override
public void psubscribe(String… patterns) {

super.psubscribe(patterns);
}

@Override
public void punsubscribe() {
super.punsubscribe()
}
@Override
public void punsubscribe(String… patterns) {
super.punsubscribe(patterns);
}

@Override
public void onMessage(String channel, String message) {
System.out.println(“channel:” + channel + “receives message :” + message);
this.unsubscribe();
}

@Override
public void onPMessage(String pattern, String channel, String message) {
}

@Override
public void onSubscribe(String channel, int subscribedChannels) {
System.out.println(“channel:” + channel + “is been subscribed:” + subscribedChannels);
}

@Override
public void onPUnsubscribe(String pattern, int subscribedChannels) {
}

@Override
public void onPSubscribe(String pattern, int subscribedChannels) {
}

@Override
public void onUnsubscribe(String channel, int subscribedChannels) {
System.out.println(“channel:” + channel + “is been unsubscribed:” + subscribedChannels);
}
.

6.2 连接redis进行订阅
public class TestSubscribe {

@Test
public void testSubscribe() throws Exception{
.//连接redis数据库
Jedis jedis = new Jedis(“localhost”);
//实例化监听器
RedisMsgPubSubListener listener = new RedisMsgPubSubListener();
//监听公众号 订阅
jedis.subscribe(listener, “redisChatTest”);
.
}

}

6.2 连接redis进行发布消息
.
Public class TestPublish {

@Test
public void testPublish() throws Exception{
Jedis jedis = new Jedis(“localhost”);
jedis.publish(“redisChatTest”, “我是天才”);
Thread.sleep(5000);
jedis.publish(“redisChatTest”, “我牛逼”);
Thread.sleep(5000);
jedis.publish(“redisChatTest”, “哈哈”);

}

}

7、Redis监听key过期失效
过期事件通过Redis的订阅与发布功能(pub/sub)来进行分发。

而对超时的监听呢,并不需要自己发布,只有修改配置文件redis.conf中的:notify-keyspace-events Ex,默认为notify-keyspace-events “”
修改好配置文件后,redis会对设置了expire的数据进行监听,当数据过期时便会将其从redis中删除:

1.先写一个监听器:

public class KeyExpiredListener extends JedisPubSub {

@Override
public void onPSubscribe(String pattern, int subscribedChannels) {
    System.out.println("onPSubscribe "
            + pattern + " " + subscribedChannels);
}

@Override
public void onPMessage(String pattern, String channel, String message) {

    System.out.println("onPMessage pattern "
                    + pattern + " " + channel + " " + message);
}

}

2.订阅者:

public class Subscriber {

public static void main(String[] args) {
    JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");
    Jedis jedis = pool.getResource();
    jedis.psubscribe(new KeyExpiredListener(), "__key*__:*");

}

}

3.测试类:

public class TestJedis {

public static void main(String[] args) {
    JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");

    Jedis jedis = pool.getResource();
    jedis.set("notify", "我要监控一下");
    jedis.expire("notify", 10);

}

}

4.结果:
先启动订阅者,然后执行测试类,然后等待10秒之后再监听类的方法中就可以获得回调。非常需要注意的是,过期监听的管道默认是__keyevent@0__:expired,@后面的0表示第几个是数据库,redis默认的数据库是0~15一共16个数据库。所以如果你存入的数据库是2,那么数据接收的管道就是__keyevent@2__:expired

8、redis的可视化工具介绍
Redis Desktop Manager可视化工具

https://www.jianshu.com/p/6895384d2b9e 下载安装步骤

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值