Redis基礎知識小結
Redis是一個高性能的key-value型數據庫。Redis能讀的速度是110000次/s,寫的速度是81000次/s ,性能極高。Redis的所有操作都是原子性的,意思就是要麽成功執行要麽失敗完全不執行。單個操作是原子性的,多個操作支持事務。
Redis是運行在內存中的,因此速度極快,由於數據是在內存中,關機後數據將丟失,但是redis是支持數據持久化的,將數據保存到磁盤中,重啟的時候可以再次加載進行使用。
1.Redis使用場景:
數據實時性要求高,數據存儲有過期和淘汰特征的,不需要保證弱一致性,邏輯簡單的場景。
具體如下:
(1)緩存
緩存現在幾乎是所有中大型網站都在用的必殺技,合理的利用緩存不僅能夠提升網站訪問速度,還能大大降低數據庫的壓力。Redis提供了鍵過期功能,也提供了靈活的鍵淘汰策略,所以,現在Redis用在緩存的場合非常多。
(2)排行榜
很多網站都有排行榜應用的,如京東的月度銷量榜單、商品按時間的上新排行榜等。Redis提供的有序集合數據類型能實現各種復雜的排行榜應用。
(3)計數器
什麽是計數器,如電商網站商品的瀏覽量、視頻網站視頻的播放數等。為了保證數據實時效,每次瀏覽都得給+1,並發量高時如果每次都請求數據庫操作無疑是種挑戰和壓力。Redis提供的incr命令來實現計數器功能,內存操作,性能非常好,非常適用於這些計數場景。
(4)分布式會話
集群模式下,在應用不多的情況下一般使用容器自帶的session復制功能就能滿足,當應用增多相對復雜的系統中,一般都會搭建以Redis等內存數據庫為中心的session服務,session不再由容器管理,而是由session服務及內存數據庫管理。
(5)分布式鎖
在很多互聯網公司中都使用了分布式技術,分布式技術帶來的技術挑戰是對同一個資源的並發訪問,如全局ID、減庫存、秒殺等場景,並發量不大的場景可以使用數據庫的悲觀鎖、樂觀鎖來實現,但在並發量高的場合中,利用數據庫鎖來控制資源的並發訪問是不太
理想的,大大影響了數據庫的性能。可以利用Redis的setnx功能來編寫分布式的鎖,如果設置返回1說明獲取鎖成功,否則獲取鎖失敗,實際應用中要考慮的細節要更多。
2.Redis數據類型
string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
3.在Java中使用Redis
Jedis是在java中用來操作Redis的工具。
下載驅動包jedis.jar,並將該驅動包包含在classpath下,同時需具備java環境和redis環境。
applicationContext.xml中添加 :
<!-- 讀取配置文件信息 --> <context:property-placeholder location="classpath:redis.properties" file-encoding="UTF-8" ignore-unresolvable="true"/> <!-- Jedis 連接池配置 --> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="${redis.pool.maxTotal}"/> <property name="maxIdle" value="${redis.pool.maxIdle}"/> <property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}"/> <property name="testOnBorrow" value="${redis.pool.testOnBorrow}"/> </bean> <bean id="jedisPool" class="redis.clients.jedis.JedisPool"> <constructor-arg ref="jedisPoolConfig"/> <constructor-arg value="${jedis.host}" type="java.lang.String"/> <constructor-arg type="int" value="${jedis.port}"/> </bean>
redis.properties:
# 控制一個pool可分配多少個jedis實例
redis.pool.maxTotal=1000
# 控制一個pool最多有多少個狀態為idle(空閑)的jedis實例
redis.pool.maxIdle=200
# 表示當borrow一個jedis實例時,最大的等待時間,如果超過等待時間,則直接拋出JedisConnectionException
redis.pool.maxWaitMillis=2000
#在borrow一個jedis實例時,是否提前進行validate操作;如果為true,則得到的jedis實例均是可用的
redis.pool.testOnBorrow=true
# redis 單機
# 單機 host
jedis.host=127.0.0.1
# 單機 port
jedis.port=6379
java類:
@Autowired private JedisPool jedisPool; public Jedis getJedis() { Jedis jedis = this.jedisPool.getResource(); // 使用index為2的database jedis.select(2); return jedis; } public void set(String key, String value, int seconds) { Jedis jedis = null; try { jedis = getJedis(); jedis.setex(key, seconds, value); Long exp = jedis.ttl(key); if (exp < 0) { throw new RuntimeException("data time out!");19 } } catch (Throwable e) { logger.error(e.getMessage(), e); throw new TokenException(e.getMessage()); } finally { if(jedis != null){jedis.close;} } }
Redis基礎知識小結