Mysql + Redis实现排行榜实战(让Redis做好自己的事情)
1)pom.xml
<dependencies><!-- https://mvnrepository.com/artifact/com.alibaba/druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.18</version></dependency><!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency></dependencies>
2)druid.properties连接池配置
driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql:///db_mysql_redis_rankusername=rootpassword=jiananinitialSize=10maxActive=20maxWait=3000
3)jedis.properties
host=127.0.0.1port=6379maxTotal=50maxIdle=10
4)数据库内容
5)JDBCUtils.java
package Demo03.utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;public class JDBCUtils {private static DataSource ds;static {try {Properties pro = new Properties();pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));ds = DruidDataSourceFactory.createDataSource(pro);} catch (Exception e) {e.printStackTrace();}}public static Connection getConnection() throws SQLException {return ds.getConnection();}public static DataSource getDataSource() {return ds;}public static void close(ResultSet rs, Statement stmt, Connection conn) {if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (stmt != null) {try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {// 归还连接池conn.close();} catch (SQLException e) {e.printStackTrace();}}}public static void close(Statement stmt, Connection conn) {JDBCUtils.close(null, stmt, conn);}}
6)JedisPoolUtils.java
package Demo03.utils;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;import java.io.IOException;import java.io.InputStream;import java.util.Properties;public class JedisPoolUtils {private static JedisPool jedisPool;static {InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");Properties pro = new Properties();try {pro.load(is);} catch (IOException e) {e.printStackTrace();}JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));jedisPool = new JedisPool(config, pro.getProperty("host"), Integer.parseInt(pro.getProperty("port")));}public static Jedis getJedis() {return jedisPool.getResource();}}
7)domain
User.java
package Demo03.domain;public class User {public int uid;public String uname;public int gold;public String toString() {return "User{" +"uid=" + uid +", uname='" + uname + '\'' +", gold=" + gold +'}';}}
8)MysqlCenter.java
package Demo03.dao;import Demo03.domain.User;import Demo03.utils.JDBCUtils;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;public class MysqlCenter {public static User getUserByUid(int paramUid) {Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {conn = JDBCUtils.getConnection();String sql = "select * from t_user where uid = ?";pstmt = conn.prepareStatement(sql);pstmt.setInt(1, paramUid);rs = pstmt.executeQuery();User user = null;if (rs.next()) {int uid = rs.getInt("uid");String uname = rs.getString("uname");int gold = rs.getInt("gold");user = new User();user.uid = uid;user.uname = uname;user.gold = gold;}return user;} catch (Exception e) {return null;} finally {JDBCUtils.close(rs, pstmt, conn);}}}
9)RedisCenter.java
package Demo03.dao;import Demo03.utils.JedisPoolUtils;import redis.clients.jedis.Jedis;import java.util.Set;public class RedisCenter {public static void addToRank(String uname, int gold) {Jedis jedis = JedisPoolUtils.getJedis();jedis.zadd("rank", gold, uname);jedis.close();}public static Set<String> getRank() {Jedis jedis = JedisPoolUtils.getJedis();Set<String> rankSet = jedis.zrevrange("rank", 0, -1);jedis.close();return rankSet;}}
10)Main.java 使用
package Demo03;import Demo03.dao.MysqlCenter;import Demo03.dao.RedisCenter;import Demo03.domain.User;import java.util.Set;public class Main {public static void main(String[] args) {for (int i = 1; i <= 4; i++) {User user = MysqlCenter.getUserByUid(i);RedisCenter.addToRank(user.uname, user.gold);}long s = System.currentTimeMillis();Set<String> rankSet = null;for (int i = 0; i < 10000; i++) {rankSet = RedisCenter.getRank();}System.out.println(rankSet);}}
运行结果
六月 13, 2020 2:46:32 下午 com.alibaba.druid.pool.DruidDataSource info信息: {dataSource-1} inited[]
