{"id":60136,"date":"2024-02-04T14:31:48","date_gmt":"2024-02-04T09:01:48","guid":{"rendered":"https:\/\/www.tothenew.com\/blog\/?p=60136"},"modified":"2024-02-05T14:57:35","modified_gmt":"2024-02-05T09:27:35","slug":"redis-in-java-a-step-by-step-guide-to-get-started","status":"publish","type":"post","link":"https:\/\/www.tothenew.com\/blog\/redis-in-java-a-step-by-step-guide-to-get-started\/","title":{"rendered":"Redis in Java: A Step-by-Step Guide to Get\u00a0Started"},"content":{"rendered":"<h2 class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Introduction to Redis and its benefits<\/strong><\/h2>\n<p class=\"graf graf--p\">Redis, also known as \u201cRemote Dictionary Server,\u201d is a popular open-source data store that is extensively utilized for a multitude of data storage and caching objectives. Salvatore Sanfilippo created this software, which was first introduced in 2009. Redis is known for its speed, simplicity, and versatility, and it is often referred to as a \u201cdata structure server\u201d because it supports various data structures beyond simple key-value storage.<\/p>\n<h2 class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Key Features<\/strong><\/h2>\n<ol>\n<li class=\"graf graf--p\"><strong>In-Memory Data Store:<\/strong> Redis primarily stores data in RAM (Random Access Memory).<\/li>\n<li class=\"graf graf--p\"><strong>Key-Value Store:<\/strong> Redis is often used as a key-value store, where data is associated with unique keys.<\/li>\n<li class=\"graf graf--p\"><strong>Data Structures:<\/strong> Redis offers a wide range of data structures, encompassing strings, lists, sets, sorted sets, hashes, bitmaps, and additional ones.<\/li>\n<li class=\"graf graf--p\"><strong>Persistence:<\/strong> While Redis is primarily an in-memory database, it offers optional persistence mechanisms to save data to disk.<\/li>\n<li class=\"graf graf--p\"><strong>Atomic Operations:<\/strong> Redis commands are atomic, meaning they are executed in a single step without interference from other operations.<\/li>\n<li class=\"graf graf--p\"><strong>Replication and High Availability:<\/strong> Redis supports various replication modes to create redundant copies of your data for failover and high availability. Sentinel and Redis Cluster are popular options for achieving this.<\/li>\n<li class=\"graf graf--p\"><strong>Extensive Client Libraries:<\/strong> Redis has client libraries available for many programming languages, making it accessible for developers using different tech stacks.<\/li>\n<\/ol>\n<h2 class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Redis data structures and commands<\/strong><\/h2>\n<p class=\"graf graf--p\">Redis supports various data types, each designed for specific use cases. Understanding these data types and their characteristics is essential for effectively using Redis in different scenarios. Here are some of the key Redis data types and their common use cases:<\/p>\n<h2 class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Strings<\/strong><\/h2>\n<p class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Use Case:<\/strong> Simple key-value storage.<br \/>\n<strong class=\"markup--strong markup--p-strong\">Description:<\/strong> Strings can hold text, binary data, or integers. You can perform operations like GET, SET, INCR (increment), and DECR (decrement) on string values. Strings are commonly used for caching, session storage, and counters.<br \/>\n<strong class=\"markup--strong markup--p-strong\">Commands:<\/strong><br \/>\nset key value<br \/>\nset company \u201cTTN\u201d ( set company \u201cTTN\u201d)<br \/>\nget key<br \/>\nget company (get company\u200a\u2014\u200aThis will return TTN as value)<br \/>\nset key value nx\u200a\u2014\u200aIf Key already exist and don\u2019t want to replace existing value<br \/>\nset key value xx\u200a\u2014\u200aIf Key already exist and want to replace existing value else it will not create new key<br \/>\nmset key1 value1 key2 value2 key3 value3\u200a\u2014\u200aset multiple key values<br \/>\nmget key1 key2 key3\u200a\u2014\u200aget multiple keys<\/p>\n<p class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Lists:<\/strong><\/p>\n<p class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Use Case:<\/strong> Implementing queues, logs, and maintaining ordered collections of data.<br \/>\n<strong class=\"markup--strong markup--p-strong\">Description:<\/strong> Lists allow for adding elements to the head or tail of the list. You can use LPUSH and RPUSH to push items and LPOP and RPOP to pop items. Redis lists are often used for task queues and message brokers.<br \/>\n<strong class=\"markup--strong markup--p-strong\">Commands:<\/strong><br \/>\nLPUSH key value [value\u00a0\u2026]\u200a\u2014\u200aElement insert at beginning<br \/>\nLPUSH competency JVM QE Python<br \/>\nRPUSH key value [value\u00a0\u2026]\u200a\u2014\u200aElement insert at end<br \/>\nLPOP competency\u200a\u2014\u200aThis is treat list as stack<br \/>\nRPOP competency\u200a\u2014\u200aThis is treat list as queue<br \/>\nLLEN competency\u200a\u2014\u200aThis will return list length<br \/>\nLRANGE key start stop\u200a\u2014\u200aget a range of values from a list<br \/>\nLMOVE source destination LEFT|RIGHT LEFT|RIGHT\u200a\u2014\u200aAtomically pop an element from one list and push to another<br \/>\nLTRIM key start stop\u200a\u2014\u200aTo limit the length of a list<br \/>\nDEL key\u200a\u2014\u200aIt will delete the key<br \/>\nDEL [key..]\u200a\u2014\u200aIt will delete multiple keys in one go<\/p>\n<p class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Sets:<\/strong><\/p>\n<p class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Use Case:<\/strong> Managing collections of unique, unordered values.<br \/>\n<strong class=\"markup--strong markup--p-strong\">Description:<\/strong> Sets do not allow duplicate values. You have the ability to include, exclude, and verify the presence of elements within a set. Redis sets are suitable for implementing tags, social network followers, and managing unique values.<br \/>\n<strong class=\"markup--strong markup--p-strong\">Commands:<\/strong><br \/>\nSADD key member [member\u00a0\u2026]\u200a\u2014\u200ato add one or more members to a set<br \/>\nSADD competency JS JVM<br \/>\nSMEMBERS competency\u200a\u2014\u200aget all members of a set<br \/>\nSISMEMBER key member\u200a\u2014\u200acheck if a members already present in set or not<br \/>\nSINTER key [key\u00a0\u2026]\u200a\u2014\u200aperforms the intersection between different sets<br \/>\nSCARD key\u200a\u2014\u200aget the members in a set<br \/>\nSREM key member [member\u00a0\u2026]\u200a\u2014\u200aremove items from a set<br \/>\nSDIFF key [key\u00a0\u2026]\u200a\u2014\u200areturns an empty array when the difference between all sets is empty<br \/>\nSPOP key\u200a\u2014\u200aremove a random item from a set<\/p>\n<p class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Sorted Sets (Zsets):<\/strong><\/p>\n<p class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Use Case: <\/strong>Storing data with associated scores or rankings.<br \/>\n<strong class=\"markup--strong markup--p-strong\">Description:<\/strong> Sorted sets combine the features of sets and lists. Each element has an associated score, and elements are ordered based on their scores. You can perform operations like ZADD, ZRANGE, and ZRANK. Sorted sets are used for leaderboards, rankings, and range queries.<br \/>\n<strong class=\"markup--strong markup--p-strong\">Commands:<\/strong><br \/>\nZADD key score member [score] [member]\u200a\u2014\u200aadd one or more members in sorted set<br \/>\nZADD hackers 2008 \u201cTTN User\u201d<br \/>\nZRANGE hackers 0 1\u200a\u2014\u200aget a range of members form a sorted set<br \/>\nZSCORE key member\u200a\u2014\u200aget score a member in sorted set<br \/>\nZCARD key\u200a\u2014\u200aget the number of members in sorted set<br \/>\nZRANK key member\u200a\u2014\u200areturns the rank of the provided member, assuming the sorted set is in accending order.<br \/>\nZREVRANK key member\u200a\u2014\u200areturns the rank of the provided member, assuming the sorted set is in descending order.<\/p>\n<p class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Hashes:<\/strong><\/p>\n<p class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Use Case: <\/strong>Storing structured data with multiple fields.<br \/>\n<strong class=\"markup--strong markup--p-strong\">Description:<\/strong> Hashes are maps between field names and values. You can store and retrieve individual fields within a hash, making it suitable for representing objects or records. HSET, HGET, and HMGET are common operations on hashes.<br \/>\n<strong class=\"markup--strong markup--p-strong\">Commands:<\/strong><br \/>\nHSET key field value\u200a\u2014\u200aset the value of field in a hash<br \/>\nhset company bu JVM<br \/>\nhget company \u201cbu\u201d\u200a\u2014\u200aget the value of a field from a hash<br \/>\nHINCRBY key field increment\u200a\u2014\u200aincrements the value at a given field by the integer provided<br \/>\nHMSET key field value [field value\u00a0\u2026]\u200a\u2014\u200aset multiple fields in a hash<br \/>\nHMGET key field [field\u00a0\u2026]\u200a\u2014\u200aget multiple fields from a hash<br \/>\nRetrieve all the fields and corresponding values from a hash by using the command HGETALL key.<\/p>\n<p class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Geospatial Data (Geo):<br \/>\n<\/strong> <strong class=\"markup--strong markup--p-strong\">Use Case:<\/strong> Storing and querying geospatial data like coordinates (latitude and longitude).<\/p>\n<p class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Streams:<br \/>\n<\/strong> <strong class=\"markup--strong markup--p-strong\">Use Case:<\/strong> Implementing event sourcing and message streaming.<\/p>\n<p class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Bitfields (Introduced in later versions):<br \/>\n<\/strong> <strong class=\"markup--strong markup--p-strong\">Use Case:<\/strong> Compact representation of fixed-size binary data.<\/p>\n<p class=\"graf graf--p\">For More Details\u200a\u2014\u200a<a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/redis.io\/docs\/data-types\/\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/redis.io\/docs\/data-types\/\">https:\/\/redis.io\/docs\/data-types\/<\/a><\/p>\n<h2 class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Setting up Redis in Java<\/strong><\/h2>\n<p class=\"graf graf--p\">To get started with Redis in Java, you need to set up the Redis server and include the Redis Java client library in your project. The Redis server can be installed locally or hosted on a remote server. Once the server is up and running, you can connect to it using the Redis Java client library.<\/p>\n<p class=\"graf graf--p\">To include the Redis Java client library in your project, you can either download the JAR file manually or use a dependency management tool like Maven or Gradle. Here is an example of how to add the Redis Java client library as a Maven dependency:<\/p>\n<pre class=\"graf graf--pre graf--preV2\" data-code-block-mode=\"1\" data-code-block-lang=\"xml\"><span class=\"pre--content\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>redis.clients<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\r\n <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>jedis<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\r\n <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>3.7.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\r\n <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span><\/span><\/pre>\n<p class=\"graf graf--p\">With the Redis server set up and the Redis Java client library added to your project, you are ready to start working with Redis in Java.<\/p>\n<h3 class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Working with Redis in Java\u200a\u2014\u200aconnecting, storing, and retrieving data<\/strong><\/h3>\n<p class=\"graf graf--p\">Now that you have set up Redis in your Java project and have a basic understanding of Redis data structures and commands, it\u2019s time to start working with Redis in Java. The first step is to connect to the Redis server using the Redis Java client library.<\/p>\n<pre class=\"graf graf--pre graf--preV2\" data-code-block-mode=\"1\" data-code-block-lang=\"java\"><span class=\"pre--content\"><span class=\"hljs-type\">Jedis<\/span> <span class=\"hljs-variable\">jedis<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">Jedis<\/span>(<span class=\"hljs-string\">\"localhost\"<\/span>, <span class=\"hljs-number\">6379<\/span>);<\/span><\/pre>\n<p class=\"graf graf--p\">Once you have established a connection, you can start storing and retrieving data from Redis. Let\u2019s say you want to store a string value with the key \u201cmessage\u201d:<\/p>\n<pre class=\"graf graf--pre graf--preV2\" data-code-block-mode=\"2\" data-code-block-lang=\"java\"><span class=\"pre--content\">jedis.set(<span class=\"hljs-string\">\"message\"<\/span>, <span class=\"hljs-string\">\"Hello, Redis!\"<\/span>);<\/span><\/pre>\n<p class=\"graf graf--p\">To retrieve the value associated with the key \u201cmessage\u201d, you can use the GET command:<\/p>\n<pre class=\"graf graf--pre graf--preV2\" data-code-block-mode=\"2\" data-code-block-lang=\"java\"><span class=\"pre--content\"><span class=\"hljs-type\">String<\/span> <span class=\"hljs-variable\">message<\/span> <span class=\"hljs-operator\">=<\/span> jedis.get(<span class=\"hljs-string\">\"message\"<\/span>);<\/span><\/pre>\n<p class=\"graf graf--p\">In addition to strings, you can also store and retrieve data using other Redis data structures. For example, to store a list of values, you can use the LPUSH command:<\/p>\n<pre class=\"graf graf--pre graf--preV2\" data-code-block-mode=\"2\" data-code-block-lang=\"java\"><span class=\"pre--content\">jedis.lpush(<span class=\"hljs-string\">\"numbers\"<\/span>, <span class=\"hljs-string\">\"1\"<\/span>, <span class=\"hljs-string\">\"2\"<\/span>, <span class=\"hljs-string\">\"3\"<\/span>);<\/span><\/pre>\n<p class=\"graf graf--p\">To retrieve the values from the list, you can use the LRANGE command:<\/p>\n<pre class=\"graf graf--pre graf--preV2\" data-code-block-mode=\"2\" data-code-block-lang=\"java\"><span class=\"pre--content\">List&lt;String&gt; numbers = jedis.lrange(<span class=\"hljs-string\">\"numbers\"<\/span>, <span class=\"hljs-number\">0<\/span>, -<span class=\"hljs-number\">1<\/span>);<\/span><\/pre>\n<p class=\"graf graf--p\">By following these simple steps, you can easily connect to Redis, store data, and retrieve data in your Java applications.<\/p>\n<h2 class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Advanced Redis features in Java\u200a\u2014\u200apub\/sub, transactions, and pipelining<\/strong><\/h2>\n<p class=\"graf graf--p\">Redis offers advanced features that go beyond basic data storage and retrieval. These features include publish\/subscribe (pub\/sub), transactions, and pipelining. Let\u2019s explore each of these features and see how they can be utilized in Java.<\/p>\n<p class=\"graf graf--p\">Pub\/sub allows you to build a messaging system using Redis. It consists of publishers who send messages and subscribers who receive messages. To use pub\/sub in Java, you can use the PUBLISH command to send messages and the SUBSCRIBE command to receive messages.<\/p>\n<pre class=\"graf graf--pre graf--preV2\" data-code-block-mode=\"2\" data-code-block-lang=\"java\"><span class=\"pre--content\"><span class=\"hljs-type\">Jedis<\/span> <span class=\"hljs-variable\">jedis<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">Jedis<\/span>(<span class=\"hljs-string\">\"localhost\"<\/span>, <span class=\"hljs-number\">6379<\/span>);\r\n<span class=\"hljs-type\">JedisPubSub<\/span> <span class=\"hljs-variable\">jedisPubSub<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">JedisPubSub<\/span>() {\r\n<span class=\"hljs-meta\">@Override<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">onMessage<\/span><span class=\"hljs-params\">(String ttnChannel, String msg)<\/span> {\r\nSystem.out.println(<span class=\"hljs-string\">\"Received a message: \"<\/span> + msg);\r\n}\r\n};\r\njedis.subscribe(jedisPubSub, <span class=\"hljs-string\">\"ttnChannel\"<\/span>);<\/span><\/pre>\n<p class=\"graf graf--p\">Transactions in Redis allow you to execute a group of commands as a single atomic operation. The entire transaction will be reverted if any of the commands are unsuccessful. You can use the MULTI, EXEC, and DISCARD commands to use transactions in Java.<\/p>\n<pre class=\"graf graf--pre graf--preV2\" data-code-block-mode=\"2\" data-code-block-lang=\"java\"><span class=\"pre--content\"><span class=\"hljs-type\">Jedis<\/span> <span class=\"hljs-variable\">jedis<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">Jedis<\/span>(<span class=\"hljs-string\">\"localhost\"<\/span>, <span class=\"hljs-number\">6379<\/span>);\r\n<span class=\"hljs-type\">Transaction<\/span> <span class=\"hljs-variable\">transaction<\/span> <span class=\"hljs-operator\">=<\/span> jedis.multi();\r\ntransaction.set(<span class=\"hljs-string\">\"key1\"<\/span>, <span class=\"hljs-string\">\"value1\"<\/span>);\r\ntransaction.set(<span class=\"hljs-string\">\"key2\"<\/span>, <span class=\"hljs-string\">\"value2\"<\/span>);\r\nList&lt;Object&gt; results = transaction.exec();<\/span><\/pre>\n<p class=\"graf graf--p\">Pipelining in Redis allows you to send multiple commands to the server without waiting for a response after each command. This can significantly improve performance when executing a large number of commands. To use pipelining in Java, you can use the Pipeline class provided by the Redis Java client library.<\/p>\n<pre class=\"graf graf--pre graf--preV2\" data-code-block-mode=\"2\" data-code-block-lang=\"java\"><span class=\"pre--content\"><span class=\"hljs-type\">Jedis<\/span> <span class=\"hljs-variable\">jedis<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">Jedis<\/span>(<span class=\"hljs-string\">\"localhost\"<\/span>, <span class=\"hljs-number\">6379<\/span>);\r\n<span class=\"hljs-type\">Pipeline<\/span> <span class=\"hljs-variable\">pipeline<\/span> <span class=\"hljs-operator\">=<\/span> jedis.pipelined();\r\npipeline.set(<span class=\"hljs-string\">\"key1\"<\/span>, <span class=\"hljs-string\">\"value1\"<\/span>);\r\npipeline.set(<span class=\"hljs-string\">\"key2\"<\/span>, <span class=\"hljs-string\">\"value2\"<\/span>);\r\nList&lt;Object&gt; results = pipeline.syncAndReturnAll();<\/span><\/pre>\n<p class=\"graf graf--p\">By utilizing these advanced features, you can enhance the functionality and performance of your Redis-powered Java applications.<\/p>\n<h2 class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Source Code<\/strong><\/h2>\n<h3 class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">pom.xml<\/strong><\/h3>\n<pre class=\"graf graf--pre graf--preV2\" data-code-block-mode=\"1\" data-code-block-lang=\"xml\"><span class=\"pre--content\"><span class=\"hljs-meta\">&lt;?xml version=<span class=\"hljs-string\">\"1.0\"<\/span> encoding=<span class=\"hljs-string\">\"UTF-8\"<\/span>?&gt;<\/span>\r\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project<\/span> <span class=\"hljs-attr\">xmlns<\/span>=<span class=\"hljs-string\">\"http:\/\/maven.apache.org\/POM\/4.0.0\"<\/span> <span class=\"hljs-attr\">xmlns:xsi<\/span>=<span class=\"hljs-string\">\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"<\/span>\r\n <span class=\"hljs-attr\">xsi:schemaLocation<\/span>=<span class=\"hljs-string\">\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"<\/span>&gt;<\/span>\r\n <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">modelVersion<\/span>&gt;<\/span>4.0.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">modelVersion<\/span>&gt;<\/span>\r\n <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">parent<\/span>&gt;<\/span>\r\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>org.springframework.boot<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\r\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>spring-boot-starter-parent<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\r\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>2.7.10<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\r\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">relativePath<\/span>\/&gt;<\/span> <span class=\"hljs-comment\">&lt;!-- lookup parent from repository --&gt;<\/span>\r\n <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">parent<\/span>&gt;<\/span>\r\n <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>com.redis<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\r\n <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>redis-with-java<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\r\n <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>0.0.1-SNAPSHOT<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\r\n <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">name<\/span>&gt;<\/span>redis-poc<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">name<\/span>&gt;<\/span>\r\n <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">description<\/span>&gt;<\/span>Redis project with Spring Boot<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">description<\/span>&gt;<\/span>\r\n <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">properties<\/span>&gt;<\/span>\r\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">java.version<\/span>&gt;<\/span>1.8<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">java.version<\/span>&gt;<\/span>\r\n <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">properties<\/span>&gt;<\/span>\r\n <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependencies<\/span>&gt;<\/span>\r\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>redis.clients<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\r\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>jedis<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\r\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>org.apache.commons<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\r\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>commons-pool2<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\r\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>2.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\r\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>org.springframework.boot<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\r\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>spring-boot-starter-data-redis<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\r\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>org.springframework.boot<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\r\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>spring-boot-starter-web<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\r\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n\r\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>org.springframework.boot<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\r\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>spring-boot-starter-test<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\r\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">scope<\/span>&gt;<\/span>test<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">scope<\/span>&gt;<\/span>\r\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>junit<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\r\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>junit<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\r\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>4.12<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\r\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">scope<\/span>&gt;<\/span>test<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">scope<\/span>&gt;<\/span>\r\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\r\n <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependencies<\/span>&gt;<\/span>\r\n\r\n <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">build<\/span>&gt;<\/span>\r\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugins<\/span>&gt;<\/span>\r\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugin<\/span>&gt;<\/span>\r\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>org.springframework.boot<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\r\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>spring-boot-maven-plugin<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\r\n   <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">plugin<\/span>&gt;<\/span>\r\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">plugins<\/span>&gt;<\/span>\r\n <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">build<\/span>&gt;<\/span>\r\n\r\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">project<\/span>&gt;<\/span><\/span><\/pre>\n<h3 class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">application.properties<\/strong><\/h3>\n<pre class=\"graf graf--pre graf--preV2\" data-code-block-mode=\"0\"><span class=\"pre--content\">redis.host=localhost\r\nredis.port=6379\r\nredis.password=\r\nredis.jedis.pool.max-total=16\r\nredis.jedis.pool.max-idle=8\r\nredis.jedis.pool.min-idle=4<\/span><\/pre>\n<h3 class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">RedisApplication.java<\/strong><\/h3>\n<pre class=\"graf graf--pre graf--preV2\" data-code-block-mode=\"2\" data-code-block-lang=\"java\"><span class=\"pre--content\"><span class=\"hljs-keyword\">package<\/span> com.redis;\r\n\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.boot.SpringApplication;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.boot.autoconfigure.SpringBootApplication;\r\n\r\n<span class=\"hljs-meta\">@SpringBootApplication<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title class_\">RedisApplication<\/span> {\r\n\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">main<\/span><span class=\"hljs-params\">(String[] args)<\/span> {\r\n  SpringApplication.run(RedisApplication.class, args);\r\n }\r\n\r\n}<\/span><\/pre>\n<h3 class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">RedisConf.java<\/strong><\/h3>\n<pre class=\"graf graf--pre graf--preV2\" data-code-block-mode=\"2\" data-code-block-lang=\"java\"><span class=\"pre--content\"><span class=\"hljs-keyword\">package<\/span> com.redis.config;\r\n\r\n<span class=\"hljs-keyword\">import<\/span> com.redis.model.Employee;\r\n<span class=\"hljs-keyword\">import<\/span> org.apache.commons.pool2.impl.GenericObjectPoolConfig;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.beans.factory.annotation.Qualifier;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.beans.factory.annotation.Value;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.context.annotation.Bean;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.context.annotation.Configuration;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.data.redis.connection.RedisPassword;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.data.redis.connection.RedisStandaloneConfiguration;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.data.redis.connection.jedis.JedisClientConfiguration;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.data.redis.connection.jedis.JedisConnectionFactory;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.data.redis.core.HashOperations;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.data.redis.core.ListOperations;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.data.redis.core.RedisTemplate;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.data.redis.core.SetOperations;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.data.redis.serializer.StringRedisSerializer;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.util.StringUtils;\r\n\r\n<span class=\"hljs-meta\">@Configuration<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title class_\">RedisConf<\/span> {\r\n\r\n <span class=\"hljs-meta\">@Value(\"${redis.host}\")<\/span>\r\n <span class=\"hljs-keyword\">private<\/span> String host;\r\n <span class=\"hljs-meta\">@Value(\"${redis.password}\")<\/span>\r\n <span class=\"hljs-keyword\">private<\/span> String password;\r\n <span class=\"hljs-meta\">@Value(\"${redis.port}\")<\/span>\r\n <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-type\">int<\/span> port;\r\n\r\n <span class=\"hljs-meta\">@Value(\"${redis.jedis.pool.max-total}\")<\/span>\r\n <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-type\">int<\/span> maxTotal;\r\n <span class=\"hljs-meta\">@Value(\"${redis.jedis.pool.max-idle}\")<\/span>\r\n <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-type\">int<\/span> maxIdle;\r\n <span class=\"hljs-meta\">@Value(\"${redis.jedis.pool.min-idle}\")<\/span>\r\n <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-type\">int<\/span> minIdle;\r\n\r\n <span class=\"hljs-meta\">@Bean<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> JedisClientConfiguration <span class=\"hljs-title function_\">getJedisClientConfiguration<\/span><span class=\"hljs-params\">()<\/span> {\r\n  JedisClientConfiguration.<span class=\"hljs-type\">JedisPoolingClientConfigurationBuilder<\/span> <span class=\"hljs-variable\">JedisPoolingClientConfigurationBuilder<\/span> <span class=\"hljs-operator\">=<\/span> (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration\r\n    .builder();\r\n  <span class=\"hljs-type\">GenericObjectPoolConfig<\/span> <span class=\"hljs-variable\">GenericObjectPoolConfig<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">GenericObjectPoolConfig<\/span>();\r\n  GenericObjectPoolConfig.setMaxTotal(maxTotal);\r\n  GenericObjectPoolConfig.setMaxIdle(maxIdle);\r\n  GenericObjectPoolConfig.setMinIdle(minIdle);\r\n  <span class=\"hljs-keyword\">return<\/span> JedisPoolingClientConfigurationBuilder.poolConfig(GenericObjectPoolConfig).build();\r\n }\r\n\r\n <span class=\"hljs-meta\">@Bean<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> JedisConnectionFactory <span class=\"hljs-title function_\">getJedisConnectionFactory<\/span><span class=\"hljs-params\">()<\/span> {\r\n  <span class=\"hljs-type\">RedisStandaloneConfiguration<\/span> <span class=\"hljs-variable\">redisStandaloneConfiguration<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">RedisStandaloneConfiguration<\/span>();\r\n  redisStandaloneConfiguration.setHostName(host);\r\n  <span class=\"hljs-keyword\">if<\/span> (!StringUtils.isEmpty(password)) {\r\n   redisStandaloneConfiguration.setPassword(RedisPassword.of(password));\r\n  }\r\n  redisStandaloneConfiguration.setPort(port);\r\n  <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">JedisConnectionFactory<\/span>(redisStandaloneConfiguration, getJedisClientConfiguration());\r\n }\r\n\r\n <span class=\"hljs-meta\">@Bean<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> RedisTemplate <span class=\"hljs-title function_\">redisTemplate<\/span><span class=\"hljs-params\">()<\/span> {\r\n  RedisTemplate&lt;String, Object&gt; redisTemplate = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">RedisTemplate<\/span>&lt;String, Object&gt;();\r\n  redisTemplate.setConnectionFactory(getJedisConnectionFactory());\r\n  redisTemplate.setKeySerializer(<span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">StringRedisSerializer<\/span>());\r\n  <span class=\"hljs-keyword\">return<\/span> redisTemplate;\r\n }\r\n\r\n <span class=\"hljs-meta\">@Bean<\/span>\r\n <span class=\"hljs-meta\">@Qualifier(\"listOperations\")<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> ListOperations&lt;String, Employee&gt; <span class=\"hljs-title function_\">listOperations<\/span><span class=\"hljs-params\">(RedisTemplate&lt;String, Employee&gt; redisTemplate)<\/span> {\r\n  <span class=\"hljs-keyword\">return<\/span> redisTemplate.opsForList();\r\n }\r\n\r\n <span class=\"hljs-meta\">@Bean<\/span>\r\n <span class=\"hljs-meta\">@Qualifier(\"setOperations\")<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> SetOperations&lt;String, Employee&gt; <span class=\"hljs-title function_\">SetOperations<\/span><span class=\"hljs-params\">(RedisTemplate&lt;String, Employee&gt; redisTemplate)<\/span> {\r\n  <span class=\"hljs-keyword\">return<\/span> redisTemplate.opsForSet();\r\n }\r\n \r\n    <span class=\"hljs-meta\">@Bean<\/span>\r\n    <span class=\"hljs-keyword\">public<\/span> HashOperations&lt;String, Integer, Employee&gt; <span class=\"hljs-title function_\">hashOps<\/span><span class=\"hljs-params\">(RedisTemplate&lt;String, Object&gt;  redisTemplate)<\/span> {\r\n        <span class=\"hljs-keyword\">return<\/span> redisTemplate.opsForHash();\r\n    }\r\n\r\n}<\/span><\/pre>\n<h3 class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Employee.java<\/strong><\/h3>\n<pre class=\"graf graf--pre graf--preV2\" data-code-block-mode=\"2\" data-code-block-lang=\"java\"><span class=\"pre--content\"><span class=\"hljs-keyword\">package<\/span> com.redis.model;\r\n\r\n<span class=\"hljs-keyword\">import<\/span> java.io.Serializable;\r\n\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title class_\">Employee<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title class_\">Serializable<\/span>{\r\n \r\n <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-type\">int<\/span> id;\r\n <span class=\"hljs-keyword\">private<\/span> String company;\r\n <span class=\"hljs-keyword\">private<\/span> String name;\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-type\">boolean<\/span> <span class=\"hljs-title function_\">equals<\/span><span class=\"hljs-params\">(Object obj)<\/span> {\r\n  <span class=\"hljs-keyword\">if<\/span> (<span class=\"hljs-built_in\">this<\/span> == obj)\r\n   <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">true<\/span>;\r\n  <span class=\"hljs-keyword\">if<\/span> (obj == <span class=\"hljs-literal\">null<\/span>)\r\n   <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">false<\/span>;\r\n  <span class=\"hljs-keyword\">if<\/span> (getClass() != obj.getClass())\r\n   <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">false<\/span>;\r\n  <span class=\"hljs-type\">Employee<\/span> <span class=\"hljs-variable\">other<\/span> <span class=\"hljs-operator\">=<\/span> (Employee) obj;\r\n  <span class=\"hljs-keyword\">if<\/span> (company == <span class=\"hljs-literal\">null<\/span>) {\r\n   <span class=\"hljs-keyword\">if<\/span> (other.company != <span class=\"hljs-literal\">null<\/span>)\r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">false<\/span>;\r\n  } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (!company.equals(other.company))\r\n   <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">false<\/span>;\r\n  <span class=\"hljs-keyword\">if<\/span> (id != other.id)\r\n   <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">false<\/span>;\r\n  <span class=\"hljs-keyword\">if<\/span> (name == <span class=\"hljs-literal\">null<\/span>) {\r\n   <span class=\"hljs-keyword\">if<\/span> (other.name != <span class=\"hljs-literal\">null<\/span>)\r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">false<\/span>;\r\n  } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (!name.equals(other.name))\r\n   <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">false<\/span>;\r\n  <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">true<\/span>;\r\n }\r\n <span class=\"hljs-keyword\">public<\/span> String <span class=\"hljs-title function_\">getCompany<\/span><span class=\"hljs-params\">()<\/span> {\r\n  <span class=\"hljs-keyword\">return<\/span> company;\r\n }\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-type\">int<\/span> <span class=\"hljs-title function_\">getId<\/span><span class=\"hljs-params\">()<\/span> {\r\n  <span class=\"hljs-keyword\">return<\/span> id;\r\n }\r\n <span class=\"hljs-keyword\">public<\/span> String <span class=\"hljs-title function_\">getName<\/span><span class=\"hljs-params\">()<\/span> {\r\n  <span class=\"hljs-keyword\">return<\/span> name;\r\n }\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-type\">int<\/span> <span class=\"hljs-title function_\">hashCode<\/span><span class=\"hljs-params\">()<\/span> {\r\n  <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-type\">int<\/span> <span class=\"hljs-variable\">primeNo<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-number\">31<\/span>;\r\n  <span class=\"hljs-type\">int<\/span> <span class=\"hljs-variable\">result<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-number\">1<\/span>;\r\n  result = primeNo * result + ((company == <span class=\"hljs-literal\">null<\/span>) ? <span class=\"hljs-number\">0<\/span> : company.hashCode());\r\n  result = primeNo * result + id;\r\n  result = primeNo * result + ((name == <span class=\"hljs-literal\">null<\/span>) ? <span class=\"hljs-number\">0<\/span> : name.hashCode());\r\n  <span class=\"hljs-keyword\">return<\/span> result;\r\n }\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">setCompany<\/span><span class=\"hljs-params\">(String company)<\/span> {\r\n  <span class=\"hljs-built_in\">this<\/span>.company = company;\r\n }\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">setId<\/span><span class=\"hljs-params\">(<span class=\"hljs-type\">int<\/span> id)<\/span> {\r\n  <span class=\"hljs-built_in\">this<\/span>.id = id;\r\n }\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">setName<\/span><span class=\"hljs-params\">(String name)<\/span> {\r\n  <span class=\"hljs-built_in\">this<\/span>.name = name;\r\n }\r\n}<\/span><\/pre>\n<h3 class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">EmployeeController.java<\/strong><\/h3>\n<pre class=\"graf graf--pre graf--preV2\" data-code-block-mode=\"2\" data-code-block-lang=\"java\"><span class=\"pre--content\"><span class=\"hljs-keyword\">package<\/span> com.redis.controllers;\r\n\r\n<span class=\"hljs-keyword\">import<\/span> java.util.List;\r\n<span class=\"hljs-keyword\">import<\/span> java.util.Map;\r\n<span class=\"hljs-keyword\">import<\/span> java.util.Set;\r\n\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.beans.factory.annotation.Autowired;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.cache.annotation.CacheEvict;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.cache.annotation.Cacheable;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.cache.annotation.EnableCaching;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.web.bind.annotation.PathVariable;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.web.bind.annotation.RequestBody;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.web.bind.annotation.RequestMapping;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.web.bind.annotation.RequestMethod;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.web.bind.annotation.RestController;\r\n\r\n<span class=\"hljs-keyword\">import<\/span> com.fasterxml.jackson.core.JsonProcessingException;\r\n<span class=\"hljs-keyword\">import<\/span> com.fasterxml.jackson.databind.ObjectMapper;\r\n\r\n<span class=\"hljs-keyword\">import<\/span> com.redis.services.EmployeeService;\r\n<span class=\"hljs-keyword\">import<\/span> com.redis.model.Employee;\r\n\r\n<span class=\"hljs-meta\">@RestController<\/span>\r\n<span class=\"hljs-meta\">@EnableCaching<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title class_\">EmployeeController<\/span> {\r\n\r\n <span class=\"hljs-meta\">@Autowired<\/span>\r\n EmployeeService EmployeeService;\r\n\r\n\r\n <span class=\"hljs-meta\">@RequestMapping(method = RequestMethod.POST, value = \"\/employee-string\")<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">addEmployee<\/span><span class=\"hljs-params\">(<span class=\"hljs-meta\">@RequestBody<\/span> Employee Employee)<\/span> <span class=\"hljs-keyword\">throws<\/span> JsonProcessingException {\r\n  <span class=\"hljs-type\">ObjectMapper<\/span> <span class=\"hljs-variable\">mapper<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">ObjectMapper<\/span>();\r\n  EmployeeService.setEmployeeAsString(String.valueOf(Employee.getId()),\r\n    mapper.writeValueAsString(Employee));\r\n\r\n }\r\n\r\n <span class=\"hljs-meta\">@RequestMapping(\"\/employee-string\/{id}\")<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> String <span class=\"hljs-title function_\">readString<\/span><span class=\"hljs-params\">(<span class=\"hljs-meta\">@PathVariable<\/span> String id)<\/span> {\r\n  <span class=\"hljs-keyword\">return<\/span> EmployeeService.getEmployeeAsString(id);\r\n\r\n }\r\n\r\n <span class=\"hljs-comment\">\/\/ *******************LIST Demo*******************\/\/<\/span>\r\n\r\n <span class=\"hljs-comment\">\/\/ add employee to list<\/span>\r\n <span class=\"hljs-meta\">@RequestMapping(method = RequestMethod.POST, value = \"\/employees-list\")<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">addToEmployeeList<\/span><span class=\"hljs-params\">(<span class=\"hljs-meta\">@RequestBody<\/span> Employee Employee)<\/span> {\r\n  EmployeeService.addToEmployeesList(Employee);\r\n\r\n }\r\n\r\n <span class=\"hljs-comment\">\/\/ get all employees from a list<\/span>\r\n <span class=\"hljs-meta\">@RequestMapping(\"\/employees-list\")<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> List&lt;Employee&gt; <span class=\"hljs-title function_\">getEmployeeListMembers<\/span><span class=\"hljs-params\">()<\/span> {\r\n  <span class=\"hljs-keyword\">return<\/span> EmployeeService.getEmployeesListMembers();\r\n\r\n }\r\n\r\n <span class=\"hljs-comment\">\/\/ count all employees in a list<\/span>\r\n <span class=\"hljs-meta\">@RequestMapping(\"\/employees-list\/count\")<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> Long <span class=\"hljs-title function_\">getEmployeeListCount<\/span><span class=\"hljs-params\">()<\/span> {\r\n  <span class=\"hljs-keyword\">return<\/span> EmployeeService.getEmployeesListCount();\r\n\r\n }\r\n\r\n <span class=\"hljs-comment\">\/\/ *******************SET Demo*******************\/\/<\/span>\r\n\r\n <span class=\"hljs-comment\">\/\/ add employees to set<\/span>\r\n <span class=\"hljs-meta\">@RequestMapping(method = RequestMethod.POST, value = \"\/employees-set\")<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">addToEmployeestSet<\/span><span class=\"hljs-params\">(<span class=\"hljs-meta\">@RequestBody<\/span> Employee... Employees)<\/span> {\r\n  EmployeeService.addToEmployeesSet(Employees);\r\n\r\n }\r\n\r\n <span class=\"hljs-comment\">\/\/ get all employees from a set<\/span>\r\n <span class=\"hljs-meta\">@RequestMapping(method = RequestMethod.GET, value = \"\/employees-set\")<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> Set&lt;Employee&gt; <span class=\"hljs-title function_\">getEmployeesSetMembers<\/span><span class=\"hljs-params\">()<\/span> {\r\n  <span class=\"hljs-keyword\">return<\/span> EmployeeService.getEmployeesSetMembers();\r\n\r\n }\r\n\r\n <span class=\"hljs-comment\">\/\/ Check if employee already exists in the set<\/span>\r\n <span class=\"hljs-meta\">@RequestMapping(method = RequestMethod.POST, value = \"\/employees-set\/member\")<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-type\">boolean<\/span> <span class=\"hljs-title function_\">isSetMember<\/span><span class=\"hljs-params\">(<span class=\"hljs-meta\">@RequestBody<\/span> Employee Employee)<\/span> {\r\n  <span class=\"hljs-keyword\">return<\/span> EmployeeService.isSetMember(Employee);\r\n\r\n }\r\n\r\n <span class=\"hljs-comment\">\/\/ *****************HASH Demo**********************\/\/<\/span>\r\n\r\n <span class=\"hljs-comment\">\/\/ add employee to hash<\/span>\r\n <span class=\"hljs-meta\">@RequestMapping(method = RequestMethod.POST, value = \"\/employees-hash\")<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">savePHash<\/span><span class=\"hljs-params\">(<span class=\"hljs-meta\">@RequestBody<\/span> Employee Employee)<\/span> {\r\n  EmployeeService.savePHash(Employee);\r\n\r\n }\r\n\r\n <span class=\"hljs-comment\">\/\/ update employee in hash<\/span>\r\n <span class=\"hljs-meta\">@RequestMapping(method = RequestMethod.PUT, value = \"\/employees-hash\")<\/span>\r\n <span class=\"hljs-meta\">@CacheEvict(key = \"#Employee.id\", value = \"EmployeeHash\")<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">updatePHash<\/span><span class=\"hljs-params\">(<span class=\"hljs-meta\">@RequestBody<\/span> Employee Employee)<\/span> {\r\n  EmployeeService.updatePHash(Employee);\r\n\r\n }\r\n\r\n <span class=\"hljs-comment\">\/\/ get all employees from hash<\/span>\r\n <span class=\"hljs-meta\">@RequestMapping(method = RequestMethod.GET, value = \"\/employees-hash\")<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> Map&lt;Integer, Employee&gt; <span class=\"hljs-title function_\">findAllPHash<\/span><span class=\"hljs-params\">()<\/span> {\r\n  <span class=\"hljs-keyword\">return<\/span> EmployeeService.findAllPHash();\r\n\r\n }\r\n\r\n <span class=\"hljs-comment\">\/\/ get employee from hash<\/span>\r\n <span class=\"hljs-meta\">@RequestMapping(method = RequestMethod.GET, value = \"\/employees-hash\/{id}\")<\/span>\r\n <span class=\"hljs-meta\">@Cacheable(key = \"#id\", value = \"EmployeeHash\", unless = \"#result == null \")<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> Employee <span class=\"hljs-title function_\">findPInHash<\/span><span class=\"hljs-params\">(<span class=\"hljs-meta\">@PathVariable<\/span> <span class=\"hljs-type\">int<\/span> id)<\/span> {\r\n  <span class=\"hljs-keyword\">return<\/span> EmployeeService.findPInHash(id);\r\n\r\n }\r\n\r\n <span class=\"hljs-comment\">\/\/ delete employee from hash<\/span>\r\n <span class=\"hljs-meta\">@RequestMapping(method = RequestMethod.DELETE, value = \"\/employees-hash\/{id}\")<\/span>\r\n <span class=\"hljs-meta\">@CacheEvict<\/span> (key = <span class=\"hljs-string\">\"#id\"<\/span>, value = <span class=\"hljs-string\">\"EmployeeHash\"<\/span>)\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">deletePhash<\/span><span class=\"hljs-params\">(<span class=\"hljs-meta\">@PathVariable<\/span> <span class=\"hljs-type\">int<\/span> id)<\/span> {\r\n  EmployeeService.deletePhash(id);\r\n }\r\n\r\n}<\/span><\/pre>\n<h3 class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">EmployeeService.java<\/strong><\/h3>\n<pre class=\"graf graf--pre graf--preV2\" data-code-block-mode=\"1\" data-code-block-lang=\"java\"><span class=\"pre--content\"><span class=\"hljs-keyword\">package<\/span> com.redis.services;\r\n\r\n<span class=\"hljs-keyword\">import<\/span> java.util.List;\r\n<span class=\"hljs-keyword\">import<\/span> java.util.Map;\r\n<span class=\"hljs-keyword\">import<\/span> java.util.Set;\r\n\r\n<span class=\"hljs-keyword\">import<\/span> com.redis.model.Employee;\r\n\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title class_\">EmployeeService<\/span> {\r\n \r\n <span class=\"hljs-comment\">\/\/ String<\/span>\r\n  <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">setEmployeeAsString<\/span><span class=\"hljs-params\">(String idKey, String employee)<\/span>;\r\n\r\n  String <span class=\"hljs-title function_\">getEmployeeAsString<\/span><span class=\"hljs-params\">(String key)<\/span>;\r\n  \r\n  \r\n  <span class=\"hljs-comment\">\/\/ list<\/span>\r\n  <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">addToEmployeesList<\/span><span class=\"hljs-params\">(Employee Employee)<\/span>;\r\n\r\n  List&lt;Employee&gt; <span class=\"hljs-title function_\">getEmployeesListMembers<\/span><span class=\"hljs-params\">()<\/span>;\r\n\r\n  Long <span class=\"hljs-title function_\">getEmployeesListCount<\/span><span class=\"hljs-params\">()<\/span>;\r\n  \r\n  \r\n  <span class=\"hljs-comment\">\/\/ Set<\/span>\r\n  <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">addToEmployeesSet<\/span><span class=\"hljs-params\">(Employee... Employees)<\/span>;\r\n\r\n  Set&lt;Employee&gt; <span class=\"hljs-title function_\">getEmployeesSetMembers<\/span><span class=\"hljs-params\">()<\/span>;\r\n  \r\n  <span class=\"hljs-type\">boolean<\/span> <span class=\"hljs-title function_\">isSetMember<\/span><span class=\"hljs-params\">(Employee Employee)<\/span>;\r\n  \r\n  \r\n  <span class=\"hljs-comment\">\/\/ Hash<\/span>\r\n  <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">savePHash<\/span><span class=\"hljs-params\">(Employee Employee)<\/span>;\r\n\r\n  <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">updatePHash<\/span><span class=\"hljs-params\">(Employee Employee)<\/span>;\r\n\r\n  Map&lt;Integer, Employee&gt; <span class=\"hljs-title function_\">findAllPHash<\/span><span class=\"hljs-params\">()<\/span>;\r\n\r\n  Employee <span class=\"hljs-title function_\">findPInHash<\/span><span class=\"hljs-params\">(<span class=\"hljs-type\">int<\/span> id)<\/span>;\r\n\r\n  <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">deletePhash<\/span><span class=\"hljs-params\">(<span class=\"hljs-type\">int<\/span> id)<\/span>;\r\n\r\n}<\/span><\/pre>\n<p class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">EmployeeServiceImpl.java<\/strong><\/p>\n<pre class=\"graf graf--pre graf--preV2\" data-code-block-mode=\"2\" data-code-block-lang=\"java\"><span class=\"pre--content\"><span class=\"hljs-keyword\">package<\/span> com.redis.services.impl;\r\n\r\n<span class=\"hljs-keyword\">import<\/span> java.util.List;\r\n<span class=\"hljs-keyword\">import<\/span> java.util.Map;\r\n<span class=\"hljs-keyword\">import<\/span> java.util.Set;\r\n\r\n<span class=\"hljs-keyword\">import<\/span> com.redis.dao.EmployeeRepository;\r\n<span class=\"hljs-keyword\">import<\/span> com.redis.model.Employee;\r\n<span class=\"hljs-keyword\">import<\/span> com.redis.services.EmployeeService;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.beans.factory.annotation.Autowired;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.stereotype.Service;\r\n\r\n<span class=\"hljs-meta\">@Service<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title class_\">EmployeeServiceImpl<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title class_\">EmployeeService<\/span> {\r\n\r\n <span class=\"hljs-meta\">@Autowired<\/span>\r\n EmployeeRepository repository;\r\n \r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">setEmployeeAsString<\/span><span class=\"hljs-params\">(String idKey, String employee)<\/span> {\r\n  repository.setEmployeeAsString(idKey, employee);\r\n  \r\n }\r\n\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> String <span class=\"hljs-title function_\">getEmployeeAsString<\/span><span class=\"hljs-params\">(String key)<\/span> {\r\n  <span class=\"hljs-keyword\">return<\/span>  repository.getEmployeeAsString(key);\r\n }\r\n\r\n   <span class=\"hljs-comment\">\/\/List<\/span>\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">addToEmployeesList<\/span><span class=\"hljs-params\">(Employee Employee)<\/span> {\r\n  repository.addToEmployeesList(Employee);\r\n  \r\n }\r\n\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> List&lt;Employee&gt; <span class=\"hljs-title function_\">getEmployeesListMembers<\/span><span class=\"hljs-params\">()<\/span> {\r\n  <span class=\"hljs-keyword\">return<\/span>  repository.getEmployeesListMembers();\r\n }\r\n\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> Long <span class=\"hljs-title function_\">getEmployeesListCount<\/span><span class=\"hljs-params\">()<\/span> {\r\n  <span class=\"hljs-keyword\">return<\/span> repository.getEmployeesListCount();\r\n }\r\n\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">addToEmployeesSet<\/span><span class=\"hljs-params\">(Employee... Employees)<\/span> {\r\n  repository.addToEmployeesSet(Employees);\r\n  \r\n }\r\n\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> Set&lt;Employee&gt; <span class=\"hljs-title function_\">getEmployeesSetMembers<\/span><span class=\"hljs-params\">()<\/span> {\r\n  <span class=\"hljs-keyword\">return<\/span> repository.getEmployeesSetMembers();\r\n }\r\n\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-type\">boolean<\/span> <span class=\"hljs-title function_\">isSetMember<\/span><span class=\"hljs-params\">(Employee Employee)<\/span> {\r\n  <span class=\"hljs-keyword\">return<\/span> repository.isSetMember(Employee);\r\n }\r\n\r\n  <span class=\"hljs-comment\">\/\/Hash<\/span>\r\n \r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">savePHash<\/span><span class=\"hljs-params\">(Employee Employee)<\/span> {\r\n  repository.saveHash(Employee);\r\n  \r\n }\r\n\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">updatePHash<\/span><span class=\"hljs-params\">(Employee Employee)<\/span> {\r\n  System.out.println(<span class=\"hljs-string\">\"update DB call\"<\/span>);\r\n  repository.updateHash(Employee);\r\n  \r\n }\r\n\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> Map&lt;Integer, Employee&gt; <span class=\"hljs-title function_\">findAllPHash<\/span><span class=\"hljs-params\">()<\/span> {\r\n  <span class=\"hljs-keyword\">return<\/span> repository.findAllHash();\r\n }\r\n\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> Employee <span class=\"hljs-title function_\">findPInHash<\/span><span class=\"hljs-params\">(<span class=\"hljs-type\">int<\/span> id)<\/span> {\r\n  System.out.println(<span class=\"hljs-string\">\"DB call\"<\/span>);\r\n  <span class=\"hljs-keyword\">return<\/span> repository.findInHash(id);\r\n }\r\n\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">deletePhash<\/span><span class=\"hljs-params\">(<span class=\"hljs-type\">int<\/span> id)<\/span> {\r\n  System.out.println(<span class=\"hljs-string\">\"delete DB call\"<\/span>);\r\n  repository.deleteHash(id);\r\n  \r\n }\r\n\r\n}<\/span><\/pre>\n<h3 class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">EmployeeRepository.java<\/strong><\/h3>\n<pre class=\"graf graf--pre graf--preV2\" data-code-block-mode=\"2\" data-code-block-lang=\"java\"><span class=\"pre--content\"><span class=\"hljs-keyword\">package<\/span> com.redis.dao;\r\n\r\n<span class=\"hljs-keyword\">import<\/span> java.util.List;\r\n<span class=\"hljs-keyword\">import<\/span> java.util.Map;\r\n<span class=\"hljs-keyword\">import<\/span> java.util.Set;\r\n\r\n<span class=\"hljs-keyword\">import<\/span> com.redis.model.Employee;\r\n\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title class_\">EmployeeRepository<\/span> {\r\n \r\n <span class=\"hljs-comment\">\/\/ String<\/span>\r\n  <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">setEmployeeAsString<\/span><span class=\"hljs-params\">(String idKey, String employee)<\/span>;\r\n\r\n  String <span class=\"hljs-title function_\">getEmployeeAsString<\/span><span class=\"hljs-params\">(String idKey)<\/span>;\r\n  \r\n  \r\n  <span class=\"hljs-comment\">\/\/ list<\/span>\r\n  <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">addToEmployeesList<\/span><span class=\"hljs-params\">(Employee Employee)<\/span>;\r\n\r\n  List&lt;Employee&gt; <span class=\"hljs-title function_\">getEmployeesListMembers<\/span><span class=\"hljs-params\">()<\/span>;\r\n\r\n  Long <span class=\"hljs-title function_\">getEmployeesListCount<\/span><span class=\"hljs-params\">()<\/span>;\r\n  \r\n  <span class=\"hljs-comment\">\/\/ Set<\/span>\r\n  <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">addToEmployeesSet<\/span><span class=\"hljs-params\">(Employee... Employees)<\/span>;\r\n\r\n  Set&lt;Employee&gt; <span class=\"hljs-title function_\">getEmployeesSetMembers<\/span><span class=\"hljs-params\">()<\/span>;\r\n  \r\n  <span class=\"hljs-type\">boolean<\/span> <span class=\"hljs-title function_\">isSetMember<\/span><span class=\"hljs-params\">(Employee Employee)<\/span>;\r\n  \r\n  <span class=\"hljs-comment\">\/\/ Hash<\/span>\r\n  <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">saveHash<\/span><span class=\"hljs-params\">(Employee Employee)<\/span>;\r\n\r\n  <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">updateHash<\/span><span class=\"hljs-params\">(Employee Employee)<\/span>;\r\n\r\n  Map&lt;Integer, Employee&gt; <span class=\"hljs-title function_\">findAllHash<\/span><span class=\"hljs-params\">()<\/span>;\r\n\r\n  Employee <span class=\"hljs-title function_\">findInHash<\/span><span class=\"hljs-params\">(<span class=\"hljs-type\">int<\/span> id)<\/span>;\r\n\r\n  <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">deleteHash<\/span><span class=\"hljs-params\">(<span class=\"hljs-type\">int<\/span> id)<\/span>;\r\n  \r\n}<\/span><\/pre>\n<p class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">EmployeeRepositoryImpl.java<\/strong><\/p>\n<pre class=\"graf graf--pre graf--preV2\" data-code-block-mode=\"2\" data-code-block-lang=\"java\"><span class=\"pre--content\"><span class=\"hljs-keyword\">package<\/span> com.redis.dao.impl;\r\n\r\n<span class=\"hljs-keyword\">import<\/span> java.util.List;\r\n<span class=\"hljs-keyword\">import<\/span> java.util.Map;\r\n<span class=\"hljs-keyword\">import<\/span> java.util.Set;\r\n<span class=\"hljs-keyword\">import<\/span> java.util.concurrent.TimeUnit;\r\n\r\n<span class=\"hljs-keyword\">import<\/span> com.redis.dao.EmployeeRepository;\r\n<span class=\"hljs-keyword\">import<\/span> com.redis.model.Employee;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.beans.factory.annotation.Autowired;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.beans.factory.annotation.Qualifier;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.data.redis.core.HashOperations;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.data.redis.core.ListOperations;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.data.redis.core.RedisTemplate;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.data.redis.core.SetOperations;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.stereotype.Repository;\r\n\r\n<span class=\"hljs-meta\">@Repository<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title class_\">EmployeeRepositoryImpl<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title class_\">EmployeeRepository<\/span> {\r\n\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-type\">String<\/span> <span class=\"hljs-variable\">REDIS_LIST_KEY<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-string\">\"EmployeeList\"<\/span>;\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-type\">String<\/span> <span class=\"hljs-variable\">REDIS_SET_KEY<\/span>  <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-string\">\"EmployeeSET\"<\/span>;\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-type\">String<\/span> <span class=\"hljs-variable\">REDIS_HASH_KEY<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-string\">\"EmployeeHash\"<\/span>;\r\n\r\n <span class=\"hljs-meta\">@Autowired<\/span>\r\n <span class=\"hljs-keyword\">private<\/span> RedisTemplate&lt;String, Object&gt; redisTemplate;\r\n\r\n <span class=\"hljs-meta\">@Autowired<\/span>\r\n <span class=\"hljs-meta\">@Qualifier(\"listOperations\")<\/span>\r\n <span class=\"hljs-keyword\">private<\/span> ListOperations&lt;String, Employee&gt; ListOps;\r\n \r\n <span class=\"hljs-meta\">@Autowired<\/span>\r\n <span class=\"hljs-meta\">@Qualifier(\"setOperations\")<\/span>\r\n  <span class=\"hljs-keyword\">private<\/span> SetOperations&lt;String, Employee&gt; setOps;\r\n \r\n <span class=\"hljs-meta\">@Autowired<\/span>\r\n HashOperations&lt;String, Integer, Employee&gt; hashOps;\r\n \r\n \r\n <span class=\"hljs-comment\">\/\/\/\/ ********** String *************<\/span>\r\n\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">setEmployeeAsString<\/span><span class=\"hljs-params\">(String idKey, String employee)<\/span> {\r\n  redisTemplate.opsForValue().set(idKey, employee);\r\n  redisTemplate.expire(idKey, <span class=\"hljs-number\">10000<\/span>, TimeUnit.SECONDS);\r\n\r\n }\r\n\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> String <span class=\"hljs-title function_\">getEmployeeAsString<\/span><span class=\"hljs-params\">(String idKey)<\/span> {\r\n  <span class=\"hljs-keyword\">return<\/span> (String) redisTemplate.opsForValue().get(idKey);\r\n }\r\n\r\n <span class=\"hljs-comment\">\/\/\/\/ ********** List *************<\/span>\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">addToEmployeesList<\/span><span class=\"hljs-params\">(Employee Employee)<\/span> {\r\n   ListOps.leftPush(REDIS_LIST_KEY, Employee);\r\n }\r\n\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> List&lt;Employee&gt; <span class=\"hljs-title function_\">getEmployeesListMembers<\/span><span class=\"hljs-params\">()<\/span> {\r\n  <span class=\"hljs-comment\">\/\/ TODO Auto-generated method stub<\/span>\r\n  <span class=\"hljs-keyword\">return<\/span> ListOps.range(REDIS_LIST_KEY, <span class=\"hljs-number\">0<\/span>, -<span class=\"hljs-number\">1<\/span>);\r\n }\r\n\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> Long <span class=\"hljs-title function_\">getEmployeesListCount<\/span><span class=\"hljs-params\">()<\/span> {\r\n  <span class=\"hljs-comment\">\/\/ TODO Auto-generated method stub<\/span>\r\n  <span class=\"hljs-keyword\">return<\/span> ListOps.size(REDIS_LIST_KEY);\r\n }\r\n \r\n <span class=\"hljs-comment\">\/\/********** Set *************<\/span>\r\n\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">addToEmployeesSet<\/span><span class=\"hljs-params\">(Employee... Employees)<\/span> {\r\n  setOps.add(REDIS_SET_KEY, Employees);\r\n  \r\n }\r\n\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> Set&lt;Employee&gt; <span class=\"hljs-title function_\">getEmployeesSetMembers<\/span><span class=\"hljs-params\">()<\/span> {\r\n  <span class=\"hljs-comment\">\/\/ TODO Auto-generated method stub<\/span>\r\n  <span class=\"hljs-keyword\">return<\/span> setOps.members(REDIS_SET_KEY);\r\n }\r\n\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-type\">boolean<\/span> <span class=\"hljs-title function_\">isSetMember<\/span><span class=\"hljs-params\">(Employee Employee)<\/span> {\r\n  <span class=\"hljs-comment\">\/\/ TODO Auto-generated method stub<\/span>\r\n  <span class=\"hljs-keyword\">return<\/span> setOps.isMember(REDIS_SET_KEY, Employee);\r\n }\r\n\r\n  <span class=\"hljs-comment\">\/\/********** Hash *************<\/span>\r\n \r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">saveHash<\/span><span class=\"hljs-params\">(Employee Employee)<\/span> {\r\n  hashOps.put(REDIS_HASH_KEY, Employee.getId(), Employee);\r\n  \r\n }\r\n\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">updateHash<\/span><span class=\"hljs-params\">(Employee Employee)<\/span> {\r\n  hashOps.put(REDIS_HASH_KEY, Employee.getId(), Employee);\r\n  \r\n }\r\n\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> Map&lt;Integer, Employee&gt; <span class=\"hljs-title function_\">findAllHash<\/span><span class=\"hljs-params\">()<\/span> {\r\n  <span class=\"hljs-comment\">\/\/ TODO Auto-generated method stub<\/span>\r\n  <span class=\"hljs-keyword\">return<\/span> hashOps.entries(REDIS_HASH_KEY);\r\n }\r\n\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> Employee <span class=\"hljs-title function_\">findInHash<\/span><span class=\"hljs-params\">(<span class=\"hljs-type\">int<\/span> id)<\/span> {\r\n  <span class=\"hljs-keyword\">return<\/span> hashOps.get(REDIS_HASH_KEY, id);\r\n }\r\n\r\n <span class=\"hljs-meta\">@Override<\/span>\r\n <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">deleteHash<\/span><span class=\"hljs-params\">(<span class=\"hljs-type\">int<\/span> id)<\/span> {\r\n  hashOps.delete(REDIS_HASH_KEY, id);\r\n  \r\n }\r\n\r\n}<\/span><\/pre>\n<h3 class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Redis in Java best practices and performance optimization<\/strong><\/h3>\n<p class=\"graf graf--p\">While Redis provides a powerful and efficient data storage solution, certain best practices and performance optimization techniques can further improve the performance of your Redis-powered Java applications. Below are a few essential factors to consider:<\/p>\n<ol class=\"postList\">\n<li class=\"graf graf--li\">Use pipelining and batch operations: Instead of sending individual commands to Redis, you can use pipelining and batch operations to send multiple commands in a single network round trip, reducing latency and increasing throughput.<\/li>\n<li class=\"graf graf--li\">Utilize Redis data structures effectively: Redis offers a variety of data structures, each with its advantages and use cases. Understanding these data structures and choosing the right one for your specific scenario can greatly improve performance.<\/li>\n<li class=\"graf graf--li\">Implement proper error handling: Redis operations can fail for various reasons, such as network issues or server errors. It is important to implement proper error handling and recovery mechanisms to handle such situations gracefully.<\/li>\n<li class=\"graf graf--li\">Monitor Redis performance: Regularly monitor the performance of your Redis server using tools like Redis CLI or third-party monitoring solutions. Monitor metrics like memory usage, CPU utilization, and network latency to identify potential bottlenecks and optimize performance.<\/li>\n<li class=\"graf graf--li\">Consider data persistence options: By default, Redis stores data in memory, which means that data will be lost in case of a server restart or crash. If data persistence is critical for your application, consider enabling options like RDB snapshots or AOF logs.<\/li>\n<\/ol>\n<p class=\"graf graf--p\">By following these best practices and optimizing the performance of your Redis-powered Java applications, you can ensure a smooth and efficient experience for your users.<\/p>\n<h3 class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Redis libraries and frameworks for Java<\/strong><\/h3>\n<p class=\"graf graf--p\">In addition to the Redis Java client library, there are several other libraries and frameworks available that can further simplify working with Redis in Java. These libraries provide higher-level abstractions and additional features to enhance your development experience. Here are a few popular Redis libraries and frameworks for Java:<\/p>\n<ol class=\"postList\">\n<li class=\"graf graf--li\"><strong>Spring Data Redis:<\/strong> Spring Data Redis is a part of the Spring Data project and provides a high-level abstraction for working with Redis. It offers features like object mapping, transaction support, and integration with other Spring projects.<\/li>\n<li class=\"graf graf--li\"><strong>Jedis:<\/strong> Jedis is the official Redis Java client library and provides a low-level API for interacting with Redis. It offers a simple and intuitive interface for executing Redis commands and supports advanced features like transactions and pipelining.<\/li>\n<li class=\"graf graf--li\"><strong>Lettuce:<\/strong> Lettuce is another popular Redis Java client library that aims to be fast, scalable, and thread-safe. It provides a reactive programming model based on Java 8 CompletableFuture and supports advanced features like pub\/sub and Redis Cluster.<\/li>\n<li class=\"graf graf--li\"><strong>Redisson:<\/strong> Redisson is a Redis client for Java that provides a rich set of features and abstractions. It offers distributed data structures, caching, distributed locks, and many other features that can simplify building distributed systems with Redis.<\/li>\n<\/ol>\n<p class=\"graf graf--p\">These libraries and frameworks can save you time and effort by handling the low-level details of working with Redis, allowing you to focus on building your application logic.<\/p>\n<p class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Real-world examples and use cases of Redis in Java applications<\/strong><\/p>\n<p class=\"graf graf--p\">Redis is widely used in various real-world applications across different industries. Its speed, simplicity, and versatility make it suitable for a wide range of use cases. Here are some examples of how Redis is used in Java applications:<\/p>\n<ol class=\"postList\">\n<li class=\"graf graf--li\"><strong>Caching:<\/strong> Redis is commonly used as a cache to store frequently accessed data in memory, reducing the load on the backend systems and improving response times. It can be used to cache database queries, API responses, session data, and more.<\/li>\n<li class=\"graf graf--li\"><strong>Real-time analytics:<\/strong> Redis can be used to store and process real-time data for analytics purposes. It can handle high volumes of data and provide low latency access to the analytics engine, allowing for real-time insights and monitoring.<\/li>\n<li class=\"graf graf--li\"><strong>Session management:<\/strong> Redis can be used to store and manage user sessions in web applications. Redis provides fast and scalable session management by storing session data in memory, ensuring a smooth user experience.<\/li>\n<li class=\"graf graf--li\"><strong>Job queues and task scheduling<\/strong>: Redis\u2019 list data structure and atomic operations make it suitable for implementing job queues and task scheduling systems. It allows for reliable and efficient processing of background jobs and tasks.<\/li>\n<li class=\"graf graf--li\"><strong>Twitter:<\/strong> Twitter uses Redis for various purposes, including caching tweets and user timelines, real-time analytics, and handling real-time notifications and trending topics.<\/li>\n<li class=\"graf graf--li\"><strong>Pintrest<\/strong>: Pinterest uses Redis to improve the performance of its visual discovery platform. It helps cache user pins and boards, provides real-time recommendations, and enhances user engagement.<\/li>\n<li class=\"graf graf--li\"><strong>Instagram:<\/strong> Instagram uses Redis for caching, session management, and real-time notifications. It helps deliver timely updates and maintain user sessions efficiently.<\/li>\n<li class=\"graf graf--li\"><strong>Slack:<\/strong> Slack, a popular messaging platform, uses Redis for real-time message delivery, notifications, and channel updates. It ensures that messages reach recipients quickly and consistently.<\/li>\n<li class=\"graf graf--li\"><strong>Uber:<\/strong> Uber uses Redis for various purposes, such as driver and rider matching, real-time geospatial tracking, and managing surge pricing during high-demand periods.<\/li>\n<li class=\"graf graf--li\"><strong>Twitch:<\/strong> Twitch, a live streaming platform, relies on Redis for real-time chat, stream recommendations, and user engagement features. Redis helps deliver a smooth and interactive viewing experience.<\/li>\n<li class=\"graf graf--li\"><strong>Gaming<\/strong>: Many online multiplayer games and gaming platforms use Redis for leaderboards, player matchmaking, real-time chat, and managing in-game resources.<\/li>\n<li class=\"graf graf--li\"><strong>Financial Services:<\/strong> Financial institutions use Redis for real-time fraud detection, trading platforms, and low-latency data analytics to make quick decisions in the financial markets.<\/li>\n<li class=\"graf graf--li\"><strong>E-commerce<\/strong>: E-commerce platforms utilize Redis for real-time inventory management, personalized product recommendations, and handling flash sales and promotions.<\/li>\n<li class=\"graf graf--li\"><strong>Healthcare:<\/strong> Healthcare systems leverage Redis for real-time patient monitoring, data analysis, and managing electronic health records, ensuring that medical professionals have timely access to critical patient information.<\/li>\n<\/ol>\n<p class=\"graf graf--p\">These are just a few examples of how Redis can be utilized in Java applications. Its flexibility and performance make it a valuable tool in building scalable and responsive systems.<\/p>\n<p class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Troubleshooting and common challenges with Redis in Java<\/strong><\/p>\n<p class=\"graf graf--p\">While Redis is a powerful and reliable data store, you may encounter certain challenges and issues when working with Redis in Java. Below are a few frequently encountered troubleshooting suggestions and resolutions:<\/p>\n<ol>\n<li><strong>Connection issues:<\/strong> If you are unable to connect to the Redis server, ensure that the server is running and accessible from your Java application. Check the network configuration, firewall settings, and server logs for any errors or warnings.<\/li>\n<li><strong>Performance issues:<\/strong> If you are experiencing slow response times or high latencies, monitor the performance of your Redis server and identify potential bottlenecks. Consider optimizing your Redis operations, using pipelining, or adding more server resources if needed.<\/li>\n<li><strong>Data consistency:<\/strong> Redis guarantees eventual consistency, which means that changes made to the data may not be immediately reflected. If strong consistency is a requirement for your application, consider using Redis transactions or implementing application-level synchronization mechanisms.<\/li>\n<li><strong>Memory management:<\/strong> Redis stores data in memory, so it is important to monitor memory usage and ensure that it does not exceed the available resources. Consider enabling eviction policies or using Redis Cluster to distribute the data across multiple servers if memory becomes a constraint.<\/li>\n<li><strong>Data persistence: <\/strong>By default, Redis does not persist data to disk, which means that data will be lost in case of a server restart or crash. If data persistence is critical for your application, consider enabling persistence options like RDB snapshots or AOF logs.<\/li>\n<\/ol>\n<h2 class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Conclusion<\/strong><\/h2>\n<p class=\"graf graf--p\">In this step-by-step guide, we have explored the power of Redis in Java. We started with an introduction to Redis and its benefits, followed by the process of setting up Redis in Java. We then delved into Redis data structures and commands, showcasing how to store and retrieve data in Java.<\/p>\n<p class=\"graf graf--p\">We also explored advanced features like pub\/sub, transactions, and pipelining, as well as best practices and performance optimization techniques. Additionally, we discussed popular Redis libraries and frameworks for Java, real-world examples and use cases, and troubleshooting tips for common challenges.<\/p>\n<p class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">References:<\/strong><\/p>\n<p class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Redis Installation\u200a<\/strong><a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/redis.io\/docs\/getting-started\/installation\/\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/redis.io\/docs\/getting-started\/installation\/\"><strong class=\"markup--strong markup--p-strong\">\u2014\u200a<\/strong>https:\/\/redis.io\/docs\/getting-started\/installation\/<\/a><\/p>\n<p class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Redis Data Structure\u200a<\/strong><a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/redis.io\/docs\/data-types\/\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/redis.io\/docs\/data-types\/\"><strong class=\"markup--strong markup--p-strong\">\u2014\u200a<\/strong>https:\/\/redis.io\/docs\/data-types\/<\/a><\/p>\n<p class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">High availability with Redis Sentinel\u200a<\/strong><a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/redis.io\/docs\/management\/sentinel\/\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/redis.io\/docs\/management\/sentinel\/\"><strong class=\"markup--strong markup--p-strong\">\u2014\u200a<\/strong>https:\/\/redis.io\/docs\/management\/sentinel\/<\/a><\/p>\n<p class=\"graf graf--p\"><strong class=\"markup--strong markup--p-strong\">Redis Course\u200a<\/strong><a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/university.redis.com\/courses\/ru101\/\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/university.redis.com\/courses\/ru101\/\">\u2014\u200ahttps:\/\/university.redis.com\/courses\/ru101\/<\/a><\/p>\n<div class=\"ap-custom-wrapper\"><\/div><!--ap-custom-wrapper-->","protected":false},"excerpt":{"rendered":"<p>Introduction to Redis and its benefits Redis, also known as \u201cRemote Dictionary Server,\u201d is a popular open-source data store that is extensively utilized for a multitude of data storage and caching objectives. Salvatore Sanfilippo created this software, which was first introduced in 2009. Redis is known for its speed, simplicity, and versatility, and it is [&hellip;]<\/p>\n","protected":false},"author":1641,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":1541},"categories":[446],"tags":[5618],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/60136"}],"collection":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/users\/1641"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/comments?post=60136"}],"version-history":[{"count":3,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/60136\/revisions"}],"predecessor-version":[{"id":74250,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/60136\/revisions\/74250"}],"wp:attachment":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/media?parent=60136"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/categories?post=60136"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/tags?post=60136"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}