
string類型是實戰中應用最多的數據類型,Redis的一些特性決定了string類型的應用場景。
1. Redis的數據是共享的
如果將用戶信息存儲在web服務的本地緩存,則每個web服務都會緩存一份,當用戶修改昵稱時,需要通知其它web服務更新用戶緩存。
如果將用戶信息存儲在Redis,則只有一份緩存,所有的web訪問的都是同一份緩存,當用戶修改昵稱時,所有web服務都能同時訪問到最新的緩存。
2. Redis是單線程的
由於Redis的性能瓶頸在於內存讀寫速度,而不是CPU,設計者將Redis設計成了單線程模式,其所有操作都是原子性的,避免了多線程帶來的復雜性。
基於以上兩點特性,Redis的string類型主要有以下應用場景。
1. 計數器
string類型的incr和decr命令的作用是將key中儲存的數字值加一/減一,這兩個操作具有原子性,總能安全地進行加減操作,因此可以用string類型進行計數,如微博的評論數、點贊數、分享數,抖音作品的收藏數,京東商品的銷售量、評價數等。
2. 分布式鎖
string類型的setnx的作用是“當key不存在時,設值並返回1,當key已經存在時,不設值並返回0”,“判斷key是否存在”和“設值”兩個操作是原子性地執行的,因此可以用string類型作為分布式鎖,返回1表示獲得鎖,返回0表示沒有獲得鎖。例如,為了保證定時任務的高可用,往往會同時部署多個具備相同定時任務的服務,但是業務上只希望其中的某一台服務執行定時任務,當定時任務的時間點觸發時,多個服務同時競爭一個分布式鎖,獲取到鎖的執行定時任務,沒獲取到的放棄執行定時任務。定時任務執行完時通過del命令刪除key即釋放鎖,如果擔心del命令操作失敗而導致鎖一直未釋放,可以通過expire命令給鎖設置一個合理的自動過期時間,確保即使del命令失敗,鎖也能被釋放。不過expire命令同樣存在失敗的可能性,如果你用的是Java語言,建議使用JedisCommands接口提供的String set(String key, String value, String nxxx, String expx, long time)方法,這個方法可以將setnx和expire原子性地執行,具體使用方式如下(相信其它語言的Redis客戶端也應當提供了類似的方法)。
jedisCommands.set("IAmAKey", "1", "NX", "EX", 60);//如果"IAmAKey"不存在,則將其設值為1,同時設置60秒的自動過期時間
3. 存儲對象
利用JSON強大的兼容性、可讀性和易用性,將對象轉換為JSON字符串,再存儲在string類型中,是個不錯的選擇,如用戶信息、商品信息等。
string類型的常用命令可參考http://www.runoob.com/redis/redis-strings.html。
加入string類型的應用場景后的思維導圖如下。

