Redis是一個開源(BSD許可)的內(nèi)存數(shù)據(jù)結(jié)構(gòu)存儲,用作數(shù)據(jù)庫、緩存和消息代理。Redis提供數(shù)據(jù)結(jié)構(gòu),如strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams.。Redis具有內(nèi)置復(fù)制、Lua腳本、LRU eviction、事務(wù)和不同級別的磁盤持久性,并通過Redis Sentinel和Redis Cluster的自動分區(qū)提供高可用性。
字符串類型是Redis中最為基礎(chǔ)的數(shù)據(jù)存儲類型,它在Redis中是二進(jìn)制安全的,這意味著該類型可以接受任何格式的數(shù)據(jù),如JPEG圖像數(shù)據(jù)或json對象描述信息等。在Redis中字符串類型的value最多可以容納的數(shù)據(jù)長度是512M。
常用命令:
注意:
1.字符串a(chǎn)ppend命令會使用更多的內(nèi)存
2.整數(shù)共享:如果能使用整數(shù),就盡量使用整數(shù)
3.整數(shù)精度問題:redis能保證16位精度,17-18位的大整數(shù)就會丟失精度
Redis中Hash類型可以看成句又String key和String value的map容器。所以該類型非常適合存儲對象的信息。
常用命令:
在Redis中,List類型是按照插入順序排序的字符串鏈表。和數(shù)據(jù)庫結(jié)構(gòu)中的普通鏈表一樣,可以在頭部和尾部添加新的元素。在插入時如果鍵不存在,Redis將為該鍵創(chuàng)建一個新的鏈表。與此相反,如果鏈表中所有的元素均被移除,那么該鍵也會被從數(shù)據(jù)庫中刪除。
常用命令:
Redis 的 Set 是 String 類型的無序集合。集合成員是唯一的,這就意味著集合中不能出現(xiàn)重復(fù)的數(shù)據(jù)。Redis 中集合是通過哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是 O(1)。集合中最大的成員數(shù)為 2^32 - 1
常用命令:
Redis 有序集合和集合一樣也是 string 類型元素的集合,且不允許重復(fù)的成員。不同的是每個元素都會關(guān)聯(lián)一個 double 類型的分?jǐn)?shù)。redis 正是通過分?jǐn)?shù)來為集合中的成員進(jìn)行從小到大的排序。
常用命令:
Redis 在 2.8.9 版本添加了 HyperLogLog 結(jié)構(gòu)。Redis HyperLogLog是用來做基數(shù)統(tǒng)計的算法,HyperLogLog的優(yōu)點(diǎn)是,在輸入元素的數(shù)量或者體積非常非常大時,計算基數(shù)所需的空間總是固定 的、并且是很小的。不過這個是估算,有一定的誤差。
基數(shù)計算指的是統(tǒng)計一批元素中不重復(fù)元素的個數(shù),比如UV的統(tǒng)計。實(shí)現(xiàn)基數(shù)統(tǒng)計最常見的是用Set這種數(shù)據(jù)結(jié)構(gòu)。但是大數(shù)據(jù)量下Set會占用很大的存儲空間。
常用命令:
Redis GEO主要用于存儲地理位置信息,并對其進(jìn)行操作。該功能在Redis3.2版本增加
常用命令:
m【米】 km【千米】 ft【英尺】 mi【英里】
BitMap的原理上一篇已經(jīng)講過了,它可以用作大數(shù)據(jù)量的存儲,不過存儲的內(nèi)容只能是0或1. 可以使用在10億用戶的在線狀態(tài),1代表在線,0代表離線。
value值只能是0、1
Redis的事務(wù)與數(shù)據(jù)庫的事務(wù)概念不同,Redis會將一個事務(wù)中的所有命令序列化,然后按順序執(zhí)行。Redis不可能在一個Redis事務(wù)的執(zhí)行過程中插入執(zhí)行另一個客戶端發(fā)出的請求,事務(wù)中任意命令失敗不影響其他命令的執(zhí)行,也不會回滾。
發(fā)布訂閱是一種通信模式,發(fā)送者發(fā)送消息,訂閱者接受消息??蛻舳丝梢杂嗛喍鄠€頻道,然后有新消息發(fā)送給頻道,訂閱該頻道的客戶端就都能收到消息。
常用命令:
Redis 腳本通過Lua解釋器來執(zhí)行腳本,Redis 2.6 版本通過內(nèi)嵌支持Lua環(huán)境
基本語法如下:
EVAL script numkeys key [key ...] arg [arg ...]
例子:
EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
Redis Stream是5.0版本新增的數(shù)據(jù)結(jié)構(gòu)。Redis Stream主要用于消息隊列,Redis本身有一個發(fā)布/訂閱功能,但是它有一個缺點(diǎn),消息沒有持久化,如果網(wǎng)絡(luò)中斷或宕機(jī),數(shù)據(jù)就會丟失。
Redis Stream提供了消息的持久化和主備復(fù)制功能,它有一個消息鏈表,把所有加入的消息都串起來,每個消息都有唯一的ID和內(nèi)容。
常用命令:
xadd mystream * name sa surname occc (*代表id由redis生成)
xrange mystream - + (- 代表最小值,+ 代表最大值)
從頭開始消費(fèi):
xgroup create mystream consumer-group-name 0-0
從尾部開始消費(fèi),只接受新消息
xgroup create mystream consumer-group-name $
XREADGROUP GROUP consumer-group-name consumer-name COUNT 1 STREAMS mystream
第二個group :消費(fèi)組名
consumer: 消費(fèi)者名
count :讀取數(shù)量
milliseconds : 阻塞毫秒數(shù)
key :隊列名
ID:消息id
1.通用數(shù)據(jù)緩存:String、list
2.等會話緩存、token、session緩存
1.非嚴(yán)格一致性要求的數(shù)據(jù)
2.業(yè)務(wù)操作去重:訂單處理的冪等校驗(yàn)業(yè)務(wù)數(shù)據(jù)排序
1.全局流控
2.秒殺時庫存計算
3.全局ID生成
1.id、ip等使用bitmap操作
2.使用HyperLogLog進(jìn)行UV、PV等非精確性的統(tǒng)計
用于消息發(fā)布訂閱模式
1.獲取鎖
set key my_random_value NX PX 30000
2.釋放鎖,需要用到lua腳本保證原子性
if redis.call("get",KEYS[1])==ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end
基于BIO、線程不安全,需要配置連接池管理連接
目前主流推薦的驅(qū)動,基于Netty NIO,API線程安全
基于Netty NIO,API線程安全。大量豐富的分布式功能,如分布式的基本數(shù)據(jù)類型和鎖。
maven依賴
dependency> groupId>org.springframework.data/groupId> artifactId>spring-data-redis/artifactId> version>2.1.2.RELEASE/version> /dependency>
核心是RedisTemplate(可以配置基于Jedis、Lettuce、Redisson),封裝了基本的redis命令。
dependency> groupId>org.springframework.boot/groupId> artifactId>spring-boot-starter-data-redis/artifactId> /dependency>
配置spring.redis
如:spring.redis.host=127.0.0.1
1.啟用Spring Cache
@EnableCaching
2.方法上添加緩存注解
@Override @Cacheable(value = "userCache") public User getUser(Integer id) { return userMapper.getUser(id); }
3.配置redisCache
@Configuration public class CacheConfig { @Bean public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { return RedisCacheManager.create(redisConnectionFactory); } }
1.Redis到底是單線程,還是多線程?
這個問題有坑。首先Redis作為一個進(jìn)程來講是多個線程的。比如Redis通過多線程方式在后臺刪除對象、以及通過 Redis模塊實(shí)現(xiàn)的阻塞命令等.單線程的地方在于探測哪個接收完了請求數(shù)據(jù)->數(shù)據(jù)處理->返回數(shù)據(jù)。而其他耗時操作是用了其他線程。
探測哪個客戶端的請求接受完了,使用的是IO多路復(fù)用模型,“多路”是指多個網(wǎng)絡(luò)連接,“復(fù)用”是復(fù)用同一個線程。
2.為什么IO模塊在Redis6之前是單線程?
因?yàn)镽edis是基于內(nèi)存的操作,CPU不是瓶頸,瓶頸在于機(jī)器內(nèi)存的大小或網(wǎng)絡(luò)帶寬。
3. Redis6之后的多線程是什么?
IO模型使用了多線程的NIO模型,內(nèi)存處理線程也還是單線程。
以上就是Redis詳解的詳細(xì)內(nèi)容,更多關(guān)于Redis的資料請關(guān)注腳本之家其它相關(guān)文章!
標(biāo)簽:大慶 臺州 江蘇 北京 朝陽 吉安 楊凌 果洛
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Redis入門教程詳解》,本文關(guān)鍵詞 Redis,入門教程,詳解,Redis,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。