如何有效地存储临时用户数据
How to efficiently store temporary userdata
我是 Java 的新手,我需要一些帮助。是否有针对以下问题的(有效)解决方案:
我有一个机器人,玩家可以在其中 "roll" 获得金币。现在,在每次滚动之后,数据库都会根据用户拥有的更新硬币数量进行编辑……但这会对性能造成巨大影响。
我需要的:
User A rolls and wins 10 coins
User B rolls and wins 20 coins
User A rolls and loses 20 coins
User C rolls and wins 30 coins
User A rolls and wins 10 coins
--1 minute has ended--
--update database--
我现在拥有的:
User A rolls and wins 10 coins
--update database--
User B rolls and wins 20 coins
--update database--
User A rolls and loses 20 coins
--update database--
User C rolls and wins 30 coins
--update database--
User A rolls and wins 10 coins
--update database--
临时用户数据有没有好的存储方式?我正在考虑每次新用户滚动时使用用户名创建一个新字符串,并 link 一个具有更新值的整数,并每分钟将它们传递到数据库中。
但我觉得应该有很多更好的解决方案,我就是想不出任何东西..
如果有人能指导我一个好的方法或给我一个例子? 非常 感激不尽!提前致谢!
希望我的问题不是太笨..
https://commons.apache.org/proper/commons-jcs/
您可以使用文件读/写来临时保存数据,(仅建议)
希望,它可能会有所帮助!
您可以创建一个包含每个用户会话数据的本地缓存。在会话结束时更新数据库中的用户数据。对于缓存的实现,你可以使用HashMap。键将是您的用户,值将是用户的对象或硬币数量。
这是你得到的:
User A rolls and wins 10 coins
User B rolls and wins 20 coins
User A rolls and loses 20 coins
User C rolls and wins 30 coins
User A rolls and wins 10 coins
--User A stops playing--
--update database for user A--
User C rolls and wins 30 coins
User B rolls and wins 20 coins
User C rolls and wins 10 coins
User B rolls and wins 10 coins
--User B stops playing--
--update database for user B--
这里是一个简短的实现:
public class Game
{
private static Map<String, int> users = new ConcurrentHashMap<String, int>();
public void endGame(Sring user) {
//do something for user
updateDatabase(user, users.get(user));
}
public void roll(String user) {
//roll implementation
}
private void updateDatabase(String user, int numberOfCoins) {
//update database for user here.
}
}
只需确保您的连接只建立一次。
创建一个列表,用于临时存储数据,当列表的大小超过特定阈值时,更新数据库。
考虑将字符串发送到函数
List<String> userEvents = new ArrayList<String>();
private final int THRESHOLD = 10;
public void saveDataToDB(String event) {
userEvents.add(event);
if( userEvents.size() > THRESHOLD ) {
boolean status DBSaver.save(userEvents);
if( status ) {
userEvents.clear();
} else {
//error condition... Handle it
}
}
}
现在,DBSaver 将是一个单例 class,具有可重用的静态连接对象。
我是 Java 的新手,我需要一些帮助。是否有针对以下问题的(有效)解决方案:
我有一个机器人,玩家可以在其中 "roll" 获得金币。现在,在每次滚动之后,数据库都会根据用户拥有的更新硬币数量进行编辑……但这会对性能造成巨大影响。
我需要的:
User A rolls and wins 10 coins
User B rolls and wins 20 coins
User A rolls and loses 20 coins
User C rolls and wins 30 coins
User A rolls and wins 10 coins
--1 minute has ended--
--update database--
我现在拥有的:
User A rolls and wins 10 coins
--update database--
User B rolls and wins 20 coins
--update database--
User A rolls and loses 20 coins
--update database--
User C rolls and wins 30 coins
--update database--
User A rolls and wins 10 coins
--update database--
临时用户数据有没有好的存储方式?我正在考虑每次新用户滚动时使用用户名创建一个新字符串,并 link 一个具有更新值的整数,并每分钟将它们传递到数据库中。
但我觉得应该有很多更好的解决方案,我就是想不出任何东西..
如果有人能指导我一个好的方法或给我一个例子? 非常 感激不尽!提前致谢!
希望我的问题不是太笨..
https://commons.apache.org/proper/commons-jcs/ 您可以使用文件读/写来临时保存数据,(仅建议) 希望,它可能会有所帮助!
您可以创建一个包含每个用户会话数据的本地缓存。在会话结束时更新数据库中的用户数据。对于缓存的实现,你可以使用HashMap。键将是您的用户,值将是用户的对象或硬币数量。 这是你得到的:
User A rolls and wins 10 coins
User B rolls and wins 20 coins
User A rolls and loses 20 coins
User C rolls and wins 30 coins
User A rolls and wins 10 coins
--User A stops playing--
--update database for user A--
User C rolls and wins 30 coins
User B rolls and wins 20 coins
User C rolls and wins 10 coins
User B rolls and wins 10 coins
--User B stops playing--
--update database for user B--
这里是一个简短的实现:
public class Game
{
private static Map<String, int> users = new ConcurrentHashMap<String, int>();
public void endGame(Sring user) {
//do something for user
updateDatabase(user, users.get(user));
}
public void roll(String user) {
//roll implementation
}
private void updateDatabase(String user, int numberOfCoins) {
//update database for user here.
}
}
只需确保您的连接只建立一次。
创建一个列表,用于临时存储数据,当列表的大小超过特定阈值时,更新数据库。
考虑将字符串发送到函数
List<String> userEvents = new ArrayList<String>();
private final int THRESHOLD = 10;
public void saveDataToDB(String event) {
userEvents.add(event);
if( userEvents.size() > THRESHOLD ) {
boolean status DBSaver.save(userEvents);
if( status ) {
userEvents.clear();
} else {
//error condition... Handle it
}
}
}
现在,DBSaver 将是一个单例 class,具有可重用的静态连接对象。