Skocz do zawartości
  • 0

Redisson, jak to jest?


kurwinoksik
 Udostępnij

Pytanie

Hej wszystkim jestem tutaj nowy.

Ostatnimi czasy zainteresowałem się redisem, spodobało mi się samo działanie bazy, poczytałem o samej bazie później o Redissonie i przyszedł czas na pierwsze kodzenie :) 

Moim celem było napisanie pluginu na kity, który przekazuje stan kitów gracza pomiędzy serwerami SkyBlock.
Udało się ale nie jestem pewien czy w ten sposób powinno się robić tzn.

Po pierwsze utworzyłem obiekt Kit który przechowuje stan kitów gracza.
UUID oraz 3 pola long kiedy gracz będzie mógł odebrać dany kit.

Następnie stworzyłem klasę KitUser która przechowuje te dane w mapie Mapa<UUID, Kit>

Teraz przyszedł czas na klasę głowną.
Załadowałem clienta, pobrałem mapę z bazy i utworzyłem listenera który będzie nasłuchiwał "wysyłanych wiadomości".

Następnie zrobiłem metodę takeKit(Player, int) która jest wykonywana podczas użycia komendy /kit int, jak można zobaczyć, że drogą dedukcji wymyśliłem to tak, że na serwerze na którym gracz jest aktualnie, dane będą aktualizowane od razu, tak aby to były one od razu zaaktualizowane, bo jak patrzyłem to od wysłania do odbioru pakietu minęło 0-1ms, wiem że to mały czas no ale może być różnie, wole dmuchać na zimne :)

Dodatkowo na serwerze którym gracz odbierze kit, obiekt Kita jest wstawiany do Redisowej mapy w formie Stringa tak aby gdy odpale inny serwer skyblock dane zawsze były dostępne. 

Następnie ładowanie użytkowników z owej mapy klasa KitUser metoda load().

Na koniec dokończyłem listenera który odbiera wiadomość, jeśli dane odbierze ten sam serwer na którym gracz odebrał kita to nie jest on odbierany, bo po co skoro wcześniej ustawiłem już te dane? Lecz jeśli nie jest to ten serwer to dane są ustawiane na drugim serwerze.

 

No i teraz myślę czy to aby na pewno zostało zrobione poprawnie, bo z jednej strony można by operować na samych Mapach Redisa lecz myślę że nie jest to wygodne, przykładowo planuje tworzyć większe wtyczki, bardziej funkcjonalne i wtedy gdy obiekt będzie miał przykładowo 30 pól, no ciężko w takim scenariuszu operować na mapach.

Link do kodu: Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść!

 

Chciałem zaczerpnąć wiedzy z publicznych projektów ale ciężko było znaleźć coś fajnego.

Proszę o każdą wskazówkę dotyczącą co robię źle/co jest optymalniejsze/na co uważać i tak dalej.

Oraz dodatkowo pytanie czy w ogóle dane powinno się trzymać w redisie na stałe? Słyszałem, że lepiej te dane zapisywać np.: w MySql ale nie wiem ile jest w tym prawdy.

Za każdą odpowiedź bardzo dziękuje :) 

Edytowane przez kurwinoksik
Odnośnik do komentarza
Udostępnij na innych stronach

6 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0
W dniu 20.11.2022 o 19:26, kurwinoksik napisał:

Oraz dodatkowo pytanie czy w ogóle dane powinno się trzymać w redisie na stałe? Słyszałem, że lepiej te dane zapisywać np.: w MySql ale nie wiem ile jest w tym prawdy.

 

Redis głównie służy do szybkiego przekazywania danych, lepiej takie zapisy trzymać np. w mysql, mariadb lub co tam preferujesz.

 

Wiadomo, kod słaby, a nawet bardzo, ale tak można tak przekazywać dane.

RMap<String, String> kits

nwm po co to, do przekazywania informacji w redisie dosyć prostych powinna się tylko interesować funkcja publish/subscribe. 

 

rTopic.publishAsync(serverName + "XXX" + player.getUniqueId().toString() + "XXX" + k + "XXX" + l);

Nie musisz się też bawić tak, możesz po prostu zrobić sobie tablicę Object np.

Object[] kitObject = new Object[ilosc wartosci];
kitObject[0] = serverName;
kitObject[1] = cos tam itp itp;

//a potem publikujesz ten objekt, a przy subscribe nasluchujesz tego

 

Ja np. tak to robie

 RTopic topic = this.client.getTopic("Channel");
 Object[] values = new Object[4];
 values[0] = bababa;
 values[1] = uuuu;
 values[2] = tadadd;
 values[3] = gdgfgfd;
 topic.publish(values);

a odczytuje to tak

topic.addListenerAsync(Object[].class, (message, values) -> {
    String adads = (String) values[0];

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0
Cytat

Wiadomo, kod słaby, a nawet bardzo, ale tak można tak przekazywać dane.

Nie wydaje mi się żeby kod był "bardzo słaby", to był pierwszy plugin z redisem więc bądź wyrozumiały ale tak poza tym to wszystko jest na swoim miejscu, wiadomo można by go ulepszyć - komenda jest tragiczna, tak samo kity w obiekcie można by zrobić w mapie ale nie skupiałbym się tutaj na kodzie, bo cały post dotyczył czego innego.

Cytat

nwm po co to, do przekazywania informacji w redisie dosyć prostych powinna się tylko interesować funkcja publish/subscribe. 

No to robi aktualnie za baze danych, wyobraź sobie że wszystkie serwery padają i po włączeniu serwerów kity są zrestartowane, gracz znowu może je sobie odebrać. Dlatego pytałem czy warto je przechowywać w ten sposób.

Cytat

Nie musisz się też bawić tak, możesz po prostu zrobić sobie tablicę Object np.

No tutaj masz racje, ten sposób nie wygląda korzystnie, lecz przerobiłem go na obiekt który konwersuje klucz-wartość to do mapy i mogę pobierać jak i wstawiać wartości po kluczu w bardzo łatwy sposób.


Dzięki za opinie.
Czekam na więcej :)

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0

Kod jest tragiczny, nie pozwala na jakąkolwiek rozbudowę, a chęć dodania kita, równa się z dopisywaniem wszędzie if(k==4) give().

Powinieneś stworzyć sobie obiekt kita, zawierający pola id, cooldown (tak żeby każdy kit mógł być obierany co x czasu niezależnie), items w formie jakiejś listy. Wtedy w komendzie pobierasz sobie kita po id i sprawdzasz kiedy gracz ostatnio go brał i nadajesz itemy forem. Skróci Ci to kod niebotycznie. Nazywanie zmiennych też jakoś dziwnie, klasę nazywasz KitUser (swoją drogą java jest językiem OOP, nie wiem dlaczego korzystasz ze staticów), a w kodzie nazywasz ją kit, co sugeruje, że działasz na obiekcie kita. Aktualne pole kit zawiera pole UUID, ale z tego co widzę to UUID jest kluczem w mapie, więc nigdzie z niego nie korzystasz. Piszesz dziesiątki setterów, starczyłoby użyć lomboka. 

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0

Nie rozumiesz dlaczego napisałem ten post, plugin był pisany (max 10minut) po to aby zapytać czy poprawnie przekazuje i zapisuje dane w redisie. Nie planuje go nigdy rozbudowywać, taką metodą skończyłem go bardzo szybko nie marnując swojego czasu który sobie bardzo cenię :) Poza tym java jest językiem OOP co nie znaczy że nie możesz użyć statica. Nie zawsze twój kod będzie obiektowy bo po prostu się tak nie da. Co do lomboka to używam, tutaj akurat mi się zapomniało i wygenerowałem settery, tak btw kto pisze settery i gettery ręcznie w 2022 bruh.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0
7 godzin temu, kurwinoksik napisał:

Nie wydaje mi się żeby kod był "bardzo słaby"

21 minut temu, kurwinoksik napisał:

plugin był pisany (max 10minut) po to aby zapytać czy poprawnie przekazuje i zapisuje dane w redisie

 

23 minuty temu, kurwinoksik napisał:

tak btw kto pisze settery i gettery ręcznie w 2022 bruh.

ty

 

23 minuty temu, kurwinoksik napisał:

Poza tym java jest językiem OOP co nie znaczy że nie możesz użyć statica

Racja, ale w Twoim przypadku większość kodu powinieneś przenieść na obiekty

 

25 minut temu, kurwinoksik napisał:

Nie zawsze twój kod będzie obiektowy bo po prostu się tak nie da

Oczywiście, że da

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0
9 godzin temu, kurwinoksik napisał:

Nie wydaje mi się żeby kod był "bardzo słaby", to był pierwszy plugin z redisem więc bądź wyrozumiały ale tak poza tym to wszystko jest na swoim miejscu, wiadomo można by go ulepszyć - komenda jest tragiczna, tak samo kity w obiekcie można by zrobić w mapie ale nie skupiałbym się tutaj na kodzie, bo cały post dotyczył czego innego.

Cytat

Nawiązałem do tego na marginesie, po prostu aż ciężko się na to patrzy, bajzel i raczej każdy kto ma jakiekolwiek pojęcie o "clean code" mnie zrozumie...

3 godziny temu, kurwinoksik napisał:

tak btw kto pisze settery i gettery ręcznie w 2022 bruh.

No wiesz, osoby nieporadne życiowo będą pisać, Intelli ma wbudowaną funkcję tworzenie getterów i setterów jednym skrótem klawiszowym, ale lombok i tak rządzi.

 

9 godzin temu, kurwinoksik napisał:

Dlatego pytałem czy warto je przechowywać w ten sposób.

Tak jak wspomniałem, redisa chociażby ja bym głównie używał tylko i wyłącznie do przekazywania informacji miedzy serwerami

Odnośnik do komentarza
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Nieaktywny
Odpowiedz na pytanie...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

 Udostępnij

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...