如何有效地存储临时用户数据

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 一个具有更新值的整数,并每分钟将它们传递到数据库中。

但我觉得应该有很多更好的解决方案,我就是想不出任何东西..

如果有人能指导我一个好的方法或给我一个例子? 非常 感激不尽!提前致谢!

希望我的问题不是太笨..

http://www.javaworld.com/article/2075440/core-java/develop-a-generic-caching-service-to-improve-performance.html

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,具有可重用的静态连接对象。