Warum zählt ein Zugang? Mein früherer persönlicher Blog war Bu Suanzi für die Besuchszählung der Website, was sehr gut war, aber die Antwort war viele Male langsam. Zweitens war mein persönlicher Blog zu wenig, um zugreifen zu können, und die Daten waren nicht gut, um ?…
Der vorherige Blog -Beitrag führte kurz die Konfiguration und Verwendung von Redistemplate im Frühjahr ein. Dieser Artikel wird als einfacher Antragsfall angesehen, der hauptsächlich auf Redis -Zählern zur Implementierung von Statistiken basiert.
I. Design
Ein einfacher Zugangszähler verwendet hauptsächlich die Hash -Struktur von Redis, und die entsprechende Speicherstruktur lautet wie folgt:
Die Lagerstruktur ist relativ einfach. Um zu erweitern, entspricht jede Anwendung (oder Website) einer App und paginieren dann Statistiken basierend auf dem Pfadpfad. Schließlich gibt es eine besondere Zugangszahl für die Angabe der gesamten Website.
Ii. Durchführung
Die Hauptsache ist, die Hash -Struktur von Redis zu verwenden und dann Datenstatistiken zu implementieren. Es ist nicht allzu schwierig. Sie können sich auf die Redis -Umgebung in der Frühlingsumgebung beziehen:
Die Redistemplate -Konfiguration von Spring und Verwendung
1. REDIS -Kapselungsklasse
Für mehrere häufig verwendete, haben wir eine einfache Einkapselung vorgenommen und verwenden direkt die Excut -Methode von Redistemplate. Natürlich können wir auch Template verwenden. Hier verwenden wir JSON, um Objekte zu serialisieren und zu deserialisieren.
public class QuickRedisclient {private statische endgültige charset code = charset.forname ("utf-8"); private static redistemplate <String, String> Vorlage; public static void Register (redistemplate <String, String> Vorlage) {QuickRedisclient.Template = Vorlage; } public static void nullcheck (Objekt ... args) {für (Objekt obj: args) {if (obj == null) {werfen neuer illegalArgumentException ("Redis -Argument kann nicht null sein!"); }}} public static byte [] tobytes (String -Schlüssel) {Nullcheck (Schlüssel); return key.getBytes (Code); } public static byte [] [] tobytes (list <string> keys) {byte [] [] bytes = new Byte [keys.size ()] []; int index = 0; für (String -Schlüssel: Schlüssel) {Bytes [index ++] = tobytes (Schlüssel); } return bytes; } public static String getSstr (String -Schlüssel) {return template.execute ((reciscallback <string>) con -> {byte [] val = con.get (tobytes (key)); return val == null? null: new String (val);}); } public static void putstr (String -Schlüssel, String -Wert) {template.execute ((reciscallback <void>) con -> {con.set (tobytes (Schlüssel), Tobytes (Wert)); return null;}); } public static long Incolu (String -Schlüssel, Long Add) {return template.execute ((reciscallback <long>) con -> {long record = con.incrby (Tobytes (Schlüssel), add); return record == null? 0l: record;}); } public static long hincr (String -Schlüssel, String -Feld, long add) {return template.execute ((reciscallback <long>) con -> {long record = con.hincrby (tobytes (key), tobytes (field), add); return record == null? 0l: record;}); } public static <t> t hGet (String -Schlüssel, String -Feld, Klasse <T> clz) {return template.execute ((reciscallback <T>) con -> {byte [] records = con.hget (tobytes (taste), tobytes (field); if (records == null) {{{{{{{{{})};}; } public static <T> map <string, t> hmget (String -Schlüssel, Liste <String> Felder, Klasse <T> clz) {list <Byte []> list = template.execute ((rediscallback <list <byte [] >>) con -> con.hmget (tobytes (key), tobytes (fields)); if (collectionUtils.isempty (Liste)) {return collections.emptyMap (); } Map <string, t> result = new HashMap <> (); für (int i = 0; i <fields.size (); i ++) {if (list.get (i) == null) {Fortsetzung; } result.put (fields.get (i), json.parseObject (list.get (i), clz)); } Rückgabeergebnis; }} Entsprechende Konfigurationsklasse
Paket com.git.hui.story.cache.redis; import com.git.hui.story.cache.redis.serializer.defaultStrSerializer; import org.springFramework.cache.cacheManager; org.springframework.context.annotation.propertySource; import org.springframework org.springframework.data.redis.connection.Respassword; import org.springframework.data.redis.Connection.lettuce.LettuceConnectionFactory; */@Configuration@PropertySource (value = "classPath: application.yml") öffentliche Klasse Redisconf {private endgültige Umgebung; public redisconf (Umweltumgebung) {this. -Environment = Umwelt; } @Bean public CacheManager CacheManager () {return rediscachemanager.rediscachemanagerBuilder.fromConnectionFactory (redisconnectionFactory ()). Build (); } @Bean public redistemplate <String, String> redistemplate (redisconnectionFactory redisconnectionFactory) {redistemplate <string, string> redISTemplate = new redistemplate <> (); redistemplate.setConnectionFactory (redisconnectionFactory); DefaultStSerializer serializer = new DefaultStRSerializer (); redistemplate.setValueSerializer (Serializer); redistemplate.sethashValueSerializer (Serializer); redistemplate.setkeyserializer (serializer); redistemplate.sethashkeyserializer (serializer); redistemplate.afterPropertieStieSet (); QuickRedisclient.register (redistemplate); Redistemplate zurückgeben; } @Bean public redisconnectionFactory redisconnectionFactory () {lettuceConnectionFactory fAC = new lettuceConnectionFactory (); fac.getStandaloneConfiguration (). fac.getStandaloneConfiguration (). setport (Integer.ParseInt (Environment.getProperty ("Spring.redis.port"))); fac.getStandaloneConfiguration (). setPassword (Redispassword.of (Environment.getProperty ("Spring.Redis.Password")); fac.afterPropertieSt (); Rückkehr fak; }} 2. Controller -Unterstützung
Definieren Sie zunächst die Anforderungsparameter:
@Datapublic Class WebcountReqdo implementiert serialisierbare {private String appey; private String Referer;}Die zweite besteht darin, die Controller -Schnittstelle zu implementieren. Achten Sie auf die Logik des Zählens nach dem Pfad:
@Slf4j@RestController@RequestMapping(path = "/count")public class WebCountController { @RequestMapping(path = "cc", method = {RequestMethod.GET}) public ResponseWrapper<CountDTO> addCount(WebCountReqDO webCountReqDO) { String appKey = webCountReqDO.getAppKey(); if (stringutils.isblank (appey)) {return responseWrapper.Rorreturnmix (Status.StatUsenum.Imlegelgal_params_mix, "Bitte appey angeben!"); } String referer = reqinfocontext.getreqinfo (). GetReferer (); if (stringutils.isblank (referer)) {referer = webcountreqdo.getreferer (); } if (stringutils.isblank (referer)) {return responseWrapper.Erorreturnmix (status.statusenum.fail_mix, "Antragsteller kann nicht erhalten!"); } return responseWrapper.successReturn (doupDatecnt (appey, referer)); } private countdto doupDatecnt (String appey, String Referer) {try {if (! referer.startswith ("http")) {referer = "https: //" + referer; } Uri uri = new Uri (Referer); String host = uri.gethost (); String path = uri.getPath (); Long Count = QuickRedisclient.hincr (Appey, Pfad, 1); Long Total = QuickRedisclient.hincr (Appey, Host, 1); Return New Countdto (Count, Total); } catch (Ausnahme e) {log.Error ("Referer Pfadfehler erhalten! Referer: {}, e: {}", Referer, e); Return New Countdto (1L, 1L); }}}Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.