Linux中安裝Redisjava
Redis 是一個開源的,內存中的數據結構存儲系統它能夠用做數據庫、緩存和消息中間件。 它支持多種類型的數據結構redis
命令 | 說明 | 案例 |
---|---|---|
set | 添加key-value | set username admin |
get | 根據key獲取數據 | get username |
exists | 判斷key是否存在 | exists name(返回1存在 0不存在) |
del | 刪除redis中的key | del key |
Keys | 用於查詢符合條件的key | keys 查詢redis中所有的key,keys n?me 使用佔位符獲取數據 keys nam 獲取nam開頭的數據 |
命令 | 說明 | 案例 |
---|---|---|
hset | 爲對象添加數據 | hset key field value |
hget | 獲取對象的屬性值 | hget key field |
hexists | 判斷對象的屬性是否存在 | HEXISTS key field1表示存在 0表示不存在 |
hdel | 刪除hash中的屬性 | hdel user field |
Redis中的List集合是雙端循環列表,分別能夠從左右兩個方向插入數據
List集合能夠當作隊列使用,也能夠當作棧使用spring
隊列:存入數據的方向和獲取數據的方向相反
棧:存入數據的方向和獲取數據的方向相同
命令 | 說明 | 案例 |
---|---|---|
lpush | 從隊列的左邊入隊一個或多個元素 | LPUSH key value |
rpush | 從隊列的右邊入隊一個或多個元素 | RPUSH key value |
lpop | 從隊列的左端出隊一個元素 | LPOP key |
rpop | 從隊列的右端出隊一個元素 | RPOP key |
說明:redis中操做能夠添加事務的支持.一項任務能夠由多個redis命令完成,若是有一個命令失敗致使入庫失敗時.須要實現事務回滾.數據庫
命令 | 說明 | 案例 |
---|---|---|
multi | 標記一個事務開始 | 127.0.0.1:6379> MULTI |
exec | 執行全部multi以後發的命令 | 127.0.0.1:6379> EXEC |
discard | 丟棄全部multi以後發的命令 |
<!--spring整合redis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> </dependency>
建立一個Java類測試類json
主要目的測試程序遠程操做Redis是否有效 1.redis須要關閉IP綁定模式 2.redis關閉保護模式 3.redis最好開啓後端運行
總體結構
public void test01() throws InterruptedException { //1.測試連接 Jedis jedis = new Jedis("192.168.126.129",6379); jedis.set("a", "動態獲取redis中的數據"); System.out.println(jedis.get("a")); //2.測試數據是否存在 if(jedis.exists("a")){ jedis.set("a", "修改數據"); }else{ jedis.set("a", "新增數據"); } //3.刪除redis jedis.del("a"); //4.清空全部的數據 jedis.flushDB(); jedis.flushAll(); //5.爲數據添加超時時間 jedis.set("b", "設定超時時間"); jedis.expire("b", 10); Thread.sleep(2000); System.out.println(jedis.ttl("b")); }
Jedis jedis = new Jedis("192.168.126.129",6379); jedis.set("a", "動態獲取redis中的數據"); System.out.println(jedis.get("a"));
if(jedis.exists("a")){ jedis.set("a", "修改數據"); }else{ jedis.set("a", "新增數據"); }
判斷 a 是否存在 若是存在的話a的value值改爲<修改數據>,若是不存在的話a的value是<新增數據>segmentfault
jedis.del("a");
刪除key 是 a 的數據後端
jedis.flushDB(); jedis.flushAll();
此方法很危險刪除你的數據因此不建議使用
緩存
jedis.set("b", "設定超時時間"); jedis.expire("b", 10); Thread.sleep(2000); System.out.println(jedis.ttl("b"));
一個事務是一個不可分割的最小工做單位,要麼都成功要麼都失敗。springboot
原子操做是指你的一個業務邏輯必須是不可拆分的.好比你給別人轉錢,你的帳號扣錢,別人的帳號
增長錢,這個業務邏輯就是原子性的,這個操做就是原子操做,要麼都成功要麼都失敗。數據結構
Redis全部單個命令的執行都是原子性的。
總體結構
public void test02(){ Jedis jedis = new Jedis("192.168.126.129", 6379); jedis.set("c", "測試redis"); //需求1: 若是數據不存在時,纔會爲數據賦值. jedis.setnx("d","測試setnx方法"); System.out.println(jedis.get("d")); //需求2: 須要爲數據添加超時時間,同時知足原子性的要求 //爲數據添加超時時間 jedis.setex("s", 20, "爲數據添加超時111"); System.out.println("獲取超時時間:"+jedis.ttl("s")); }
若是數據不存在時,纔會爲數據賦值.
jedis.setnx("d","測試setnx方法"); System.out.println(jedis.get("d"));
若是d不存在的話才指定值
須要爲數據添加超時時間,同時知足原子性的要求
jedis.setex("s", 20, "爲數據添加超時111"); System.out.println("獲取超時時間:"+jedis.ttl("s"));
setex - 指定的key設置值及其過時時間。若是key已經存在, setex 命令將會替換舊的值
若是數據存在才修改,而且爲數據添加超時時間,知足原子性要求
SetParams: XX: 數據存在時賦值. NX: 數據不存在時賦值 EX: 添加超時時間單位秒 PX: 添加超時時間單位毫秒
使用Redis中的setparams
public void test03(){ Jedis jedis = new Jedis("192.168.126.129", 6379); jedis.flushAll(); SetParams setParams = new SetParams(); setParams.xx().ex(20); jedis.set("a", "測試方法",setParams); System.out.println(jedis.get("a")); }
秒殺場景: 立刻過年了, 店鋪週年店慶 1部蘋果12proMax 12000 1元秒殺? 提早預付活動費 10塊… 若是秒殺不成功 則7日內退還?
隊列:存入數據的方向和獲取數據的方向相反
@Test public void testList(){ Jedis jedis = new Jedis("192.168.126.129",6379); jedis.lpush("list", "1","2","3"); System.out.println(jedis.rpop("list")); //隊列 }
redis是公共的,建議配置放到公共的目錄中
建立一個properties配置文件裏面寫redis的節點
須要建立redis的一個配置類,配置類也放到公共的目錄中
@Configuration //表示一個配置類 通常會與@Bean的註解聯用 @PropertySource("classpath:/redis.properties") //導入配置文件 public class RedisConfig { @Value("${redis.host}") private String host; @Value("${redis.port}") private Integer port; @Bean //將方法的返回值結果,交給spring容器進行管理. public Jedis jedis(){ return new Jedis(host, port); } }
在test中測試咱們的配置
@SpringBootTest //目的:動態獲取spring容器中的數據 public class TestRedis { @Autowired private Jedis jedis; @Test public void testRedis(){ jedis.set("jedis", "spring測試"); System.out.println(jedis.get("jedis")); } }
運行時出現這樣表示成功
@Test public void test01() throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); //將對象轉化爲JSON 調用的是對象的get方法獲取屬性/屬性的值 Sysprod sysprod = new Sysprod(); sysprod.setId(1000).setTitle("對象與json轉化").setProd_name("prodname").setPrice(1000).setProd_id(1000); String json = objectMapper.writeValueAsString(sysprod); System.out.println(json); //將JSON串轉化爲對象 調用的是對象的set方法爲對象屬性賦值 Sysprod sysprod1 = objectMapper.readValue(json, Sysprod.class); System.out.println(sysprod1.getTitle()); }
把數據的get和set方式都要轉換json類型,獲取和賦值都轉成json
sysprod 是 pojo對象
@Test public void test02() throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); //將對象轉化爲JSON 調用的是對象的get方法獲取屬性/屬性的值 ItemDesc itemDesc = new ItemDesc(); itemDesc.setItemId(1000L).setItemDesc("對象與json轉化").setCreated(new Date()).setUpdated(new Date()); ItemDesc itemDesc2 = new ItemDesc(); itemDesc2.setItemId(2000L).setItemDesc("對象與json轉化2").setCreated(new Date()).setUpdated(new Date()); List<ItemDesc> list2 = new ArrayList<>(); list2.add(itemDesc); list2.add(itemDesc2); String json = objectMapper.writeValueAsString(list2); System.out.println(json); //將JSON串轉化爲對象 調用的是對象的set方法爲對象屬性賦值 List list3 = objectMapper.readValue(json,list2.getClass()); System.out.println(list3); } }
若是有兩個pojo對象那麼把兩個pojo對象包裝給list集合
該工具類,主要的功能實現對象與JSON串的互相轉化.
public class ObjectMapperUtil { private static final ObjectMapper MAPPER = new ObjectMapper(); //1.對象轉化爲JSON public static String toJSON(Object object){ try { return MAPPER.writeValueAsString(object); } catch (JsonProcessingException e) { e.printStackTrace(); throw new RuntimeException(e); } } //2.JSON轉化爲對象 要求用戶傳遞什麼類型就返回什麼對象?? public static <T> T toObj(String json,Class<T> target){ try { return MAPPER.readValue(json, target); } catch (JsonProcessingException e) { e.printStackTrace(); throw new RuntimeException(e); } } }
說明:若是頁面的數據每次都數據庫裏查詢的話這樣的效率並不高,可使用redis緩存來提高效率