vlambda博客
学习文章列表

Mysql + Redis实现排行榜实战(让Redis做好自己的事情)

点击上方“Java程序员聚集地”关注我们吧!

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;  @Override 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[贾静, 贾楠, 孙晨轩, 孙晨曦]