note.. redis五大数据类型
redis 五大數(shù)據(jù)類型使用
- nosql介紹,由來
- 什么是nosql
- 阿里巴巴的架構(gòu)
- nosql 四大分類
- redis入門
- 概述
- redis 安裝 (docker)
- 基礎(chǔ)的知識
- redis五大數(shù)據(jù)類型
- Redis-Key
- String
- List (列表)
- Set (集合)
- Hash(哈希)
- Zset 有序集合
nosql介紹,由來
1. 單機(jī)mysql~ 數(shù)據(jù)量太大,一個機(jī)器放不下~ 數(shù)據(jù)的索引(B+ tree) 一個機(jī)器的內(nèi)存也放不下~ 訪問量(讀寫混合) 一個服務(wù)器承受不了讀寫分離(垂直拆分),讀是很多的,1號myql被讀了,下個用戶又來讀。 2. memcached(緩存) + mysql + 垂直拆分 網(wǎng)站80%都是在讀,每次都要查詢數(shù)據(jù)庫十分麻煩,為例減輕服務(wù)器的壓力,使用緩存來保證效率。發(fā)展過程:優(yōu)化數(shù)據(jù)結(jié)果和索引--> 文件緩存(io) -->memcached(當(dāng)時火熱的技術(shù))3. 分庫分表 水平拆分 mysql集群 技術(shù)和業(yè)務(wù)在發(fā)展的同時,對人的要求也越來越高。 本質(zhì):讀,寫 早年myisam:表鎖,整個表鎖住 轉(zhuǎn)戰(zhàn)innodb:行鎖 so.. 使用分庫分表的方式解決寫的壓力, 表分區(qū)。 user --> 拆分. mysql集群,滿足當(dāng)時的需求4. 最近的年代 技術(shù)爆炸: 2010-2020 (定位, 音樂,熱榜) mysql 已經(jīng)滿足不了需求了。數(shù)據(jù)多,變化快。 mysql 有的使用它來存儲一些比較大的文件,博客,圖片。數(shù)據(jù)庫表很大,效率就低了。使用redis,nosql可處理這種數(shù)據(jù)。 mysql 壓力就變得十分小(如何處理) 大數(shù)據(jù)io的壓力下,表幾乎沒法更改。5 為什么要使用nosql?用戶的個人信息,社交網(wǎng)絡(luò),地理位置。 用戶自己產(chǎn)生的數(shù)據(jù),用戶日志等 爆發(fā)式增長。 需要nosql來解決~什么是nosql
nosql = not only sql
關(guān)系型數(shù)據(jù)庫:表格,行,列
泛指非關(guān)系型數(shù)據(jù)庫的,web2.0, 傳統(tǒng)的關(guān)系型數(shù)據(jù)庫很難對付web2.0時代,尤其是超大規(guī)模的高并發(fā)社區(qū)。暴露出來很多難以客服的問題,nosql在當(dāng)今大數(shù)據(jù)環(huán)境下發(fā)展迅速,redis是發(fā)展最快的。
很多的數(shù)據(jù)類型,用戶的個人信息,社交網(wǎng)絡(luò),地理位置。這些數(shù)據(jù)類型的存儲不需要一個固定的格式。是可橫向擴(kuò)展的。Map<String, Object>, kv control.
nosql 特點1、方便擴(kuò)展(數(shù)據(jù)直接沒有關(guān)系,很好擴(kuò)展)
2、大數(shù)據(jù)量高性能(redis 1s寫8萬次,1s讀取11萬次,nosql的緩存記錄級,細(xì)粒度,性能高)
3、數(shù)據(jù)類型多樣。8 無需設(shè)計數(shù)據(jù)庫。
4、傳統(tǒng)rdbms和nosql
rdbms (非關(guān)系型數(shù)據(jù)庫) - 結(jié)構(gòu)化阻止 - sql - 數(shù)據(jù)和關(guān)系存在單獨的表中 - 數(shù)據(jù)操作,數(shù)據(jù)定義語言 - 嚴(yán)格的一致性 - 基礎(chǔ)的事務(wù) acid ,,,阿里巴巴的架構(gòu)
架構(gòu)師:沒有什么是加一層解決不了的。
1. 商品的基本信息名稱,價格,商家信息關(guān)系型數(shù)據(jù)庫高i的搞定。 mysql/oracle (taobao 去ioe,王堅 阿里云的這群瘋子)2. 商品的描述,評論(文字多)文檔型數(shù)據(jù)庫,mogodb3. 圖片分布式文件系統(tǒng) fastdfs淘寶 tfsgoogle gfshadoop hdfsaliyun oss4. 商品的關(guān)鍵字(搜索)搜索引擎 solr, elasticsearchisearch 多隆5 商品的波段信息內(nèi)存數(shù)據(jù)庫redis tair memache6. 商品的交易,外部的支付接口問題:
- 數(shù)據(jù)類型太多了
- 數(shù)據(jù)源繁多,經(jīng)常重構(gòu)
- 數(shù)據(jù)要改造,大面積改造
解決:
? udsl, 數(shù)據(jù)服務(wù)層
nosql - 不僅僅是數(shù)據(jù) - 沒有固定的查詢語言 - 鍵值對存儲,列存儲,文檔存儲,圖形數(shù)據(jù)庫(社交關(guān)系) - 最終一致性 - cap定理 和 base (異地多活) - 性能,可用,可擴(kuò) ...nosql 四大分類
kv鍵值對:
- 新浪 redis
- meituan: redis + tair
- ali,baidu redis + memecache
文檔型數(shù)據(jù)庫
- mogodb 掌握
- 是基于分布式文件存儲的數(shù)據(jù)庫,c++編寫,主要處理大量的文檔
- 是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)中間的產(chǎn)品。它是非關(guān)系型數(shù)據(jù)庫中功能最豐富,最像關(guān)系型數(shù)據(jù)庫的。
- conthDB
列存儲數(shù)據(jù)庫
- hbase
- 分布式文件系統(tǒng)oss
圖關(guān)系數(shù)據(jù)庫
- 不是存圖形,放的是關(guān)系。比如,朋友圈設(shè)計網(wǎng)絡(luò),廣告推薦
- neo4j, infoGrid;
redis入門
概述
redis 遠(yuǎn)程字典服務(wù) Remote Dictionary Server1. 是什么 是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。redis會周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎(chǔ)上實現(xiàn)了master-slave(主從)同步。free, open-source, 是當(dāng)下最熱門的nosql技術(shù)之一,也被人們稱之為結(jié)構(gòu)化數(shù)據(jù)庫。2.能干嗎 - 內(nèi)存存儲,持久化,內(nèi)存中是斷電即失,所以說持久化很重要(rdb, aof) - 效率高,可用告訴緩存 - 發(fā)布訂閱系統(tǒng) - 地圖信息分析 - 計時器,計數(shù)器(瀏覽量) ...3. 特性 - 多樣的數(shù)據(jù)類型 - 持久化 - 集群 - 事務(wù) ...4. 文檔redis.io redis.cnredis 安裝 (docker)
docker 容器/usr/local/bin 配置文件
docker pull redis:6.0.9docker run -d -p 6379:6379 --name myredis redis:6.0.9docker exec -it myredis /bin/bash啟動鏡像時需要手動指定配置文件。我這沒指定。
基礎(chǔ)的知識
- redis有16個數(shù)據(jù)庫- 切換數(shù)據(jù)庫 select 1- 查看數(shù)據(jù)庫大小 DBSIZE- 清除當(dāng)前的數(shù)據(jù)庫 flushdb- 查看所有的鍵 keys *- 清空所有的數(shù)據(jù) FLUSHALLREDIS 是單線程的! redis是很快的!官方表示, redis是基于內(nèi)存操作的,cpu不是redis性能瓶頸,redis的性能是由機(jī)器的內(nèi)存和網(wǎng)絡(luò)帶寬決定的。redis是由c語言編寫的,官方數(shù)據(jù)為100000+的qps,不比memeCache差。redis為什么單線程很快?誤區(qū)1: 高性能的服務(wù)器一定是多線程的。。 誤區(qū)2: 多線程(cpu上下文切換)一定比單線程效率高。cpu 內(nèi)存 硬盤的速度核心:redis將所有的數(shù)據(jù)放到內(nèi)存里面的。使用單線程去操作效率就是高。多線程切換耗時。 對于內(nèi)存系統(tǒng)來說,如果沒有上下文切換,效率就是最高的。多次讀寫都是在一個cpu上的。redis五大數(shù)據(jù)類型
# 官網(wǎng)簡介:used as a database, cache, and message broker.Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams.Redis-Key
# 1 true, 0 false exists some_keymove some_key# made smoe key 10 second ---> 單點登錄,熱點記錄 expire name 10# see the time when expire ttl name# see the type of key type keyhttps://redis.io/commands
String
# string demo set key1 v1 get key1 keys *exists key1# stringBuffer 不存在就創(chuàng)建key append key1 "hello"# remove move key1 0 # 0為下標(biāo)# get length of string strlen key1####################################set views 1 # increase the value 1 incr viewsincr views # -1 decr views# + 10 步長 incrby views 10# -10 decrby views 10######################### # 字符串截取 getRange key 0 3 # [0, 3]getRange key 0 -1 # get key # 字符串替換, 替換指定位置的字符串 setRange key offset value## demo get key1 "aaadorable, here" 127.0.0.1:6379[1]> SETRANGE key1 0 bb (integer) 16 127.0.0.1:6379[1]> get key1 "bbadorable, here" 127.0.0.1:6379[1]> SETRANGE key1 0 bbb # 往后覆蓋。。 (integer) 16 127.0.0.1:6379[1]> get key1 "bbbdorable, here" 127.0.0.1:6379[1]>########################### # setex (set with expire) # 設(shè)置過期時間 # setnx (set if not exist) # 不存在就設(shè)置 (分布式鎖中會常用)setex key 30 'hello' # 設(shè)置key 值為hello存在30妙ttl keysetnx key1 'adorable' # 不存在就設(shè)置,存在的話,設(shè)置不了,能保證數(shù)據(jù)不被覆蓋。###################### # 同時設(shè)置或者獲取多個值 # mset k1 v1 k2 v2 # mget k1 k2# 原子性 不存在就設(shè)置,多個鍵 set k1 v1 # 下面的都不會成功,k1存在了 msetnx k1 v1 k2 v2# 對象 bastard 有錯誤。。 TODO: .... bullshit set user:1 {name:jj, age:3} # 設(shè)置一個user:1# user:{id}:{filed} value ---->user后面可以多層套娃 mset user:1:name zhangshan user:1:age 18# 獲取值 mget user:1:name user:1:age# demo 127.0.0.1:6379[1]> mset user:1:name adorable user:1:age 19 OK 127.0.0.1:6379[1]> keys * 3) "user:1:age" 4) "user:1:name" 127.0.0.1:6379[1]> mget user:1:name user:1:age 1) "adorable" 2) "19" 127.0.0.1:6379[1]>############################## getset # 先get然后在set# 如果存在值,獲取原來的值,并設(shè)置新值 getset db redis # 不存在,則返回nullgetset db hhhh # 獲取到redis這個值然后再設(shè)置成hhhhstring類型的使用場景:value可是字符串或者數(shù)字 - 計數(shù)器 - 統(tǒng)計多單位的數(shù)量 - 粉絲數(shù) - 對象緩存存儲List (列表)
redis 棧(頭),隊列(頭,尾),阻塞隊列
所有的list命令都是以l開頭的。
## base opration# left push lpush list onelpush list twolpush list threelrange list 0 -1 'three', 'two', 'one'lrange list 0 1 # 獲取頭部 three# right push 插入到右邊 rpush list right# 移除左邊的第一個 (first) lpop # 移除右邊的第一個 (last) rpop# 通過下標(biāo)獲取值 lindex someKey index lindex somekey 0# list長度 Llen someKey# 移除list集合中指定的值 lrem key count value######################### # list的截取操作 ltrim mylist 1 2 # 根據(jù)下標(biāo)截取~ mylist只剩下被截取的元素######################### # rpoplpush # 移除一個元素并添加到新的list中 rpush mylist "value1" rpush mylist "value2" rpush mylist "value3"# 將value3 添加到newlist rpoplpush mylist newlist######################### # 判斷l(xiāng)ist中是否存在值 exists list# 根據(jù)index 更新值 # 不存在列表報錯,無此index下標(biāo)越界 lset list 0 item############################ # linsert linsert mylist before/after "originValue" currentValue小總結(jié):
-
實際上是一個鏈表,before node after, left right to insert
-
如果key不存在,創(chuàng)建
-
key存在,新增內(nèi)容
-
如果移除了所有值,空鏈表,也代表不存在~
-
再兩邊插入或者改動值,效率最高!中間元素,相對來說,效率會第一點。
消息排隊。消息隊列(Lpush, Rpop) , 棧(Lpush Lpop) .
Set (集合)
########################## # set sth~ s sadd myset 'hello' sadd myset 'world' sadd myset 'adorable'# 查看set集合中的內(nèi)容 smembers myset# 判斷set集合中的值是否存在, 存在返回1, 不存在返回0 sismembers myset hello# 獲取myset中的元素個數(shù) scard myset# 移除指定的元素值 srem myset 'hhh'################################## set 無序不重復(fù)集合。抽隨機(jī)。# 隨機(jī)抽選一個元素 SRANDMEMBER myset (count)# 隨機(jī)刪除元素 spop myset (count)################################### 將一個指定的值移動到另外一個集合中 127.0.0.1:6379[1]> sadd myset cc (integer) 1 127.0.0.1:6379[1]> smembers myset 1) "hh" 2) "bb" 3) "aa" 4) "cc" 127.0.0.1:6379[1]> sadd myset1 hello (integer) 1 127.0.0.1:6379[1]> smove myset myset1 cc (integer) 1 127.0.0.1:6379[1]> smembers myset 1) "hh" 2) "bb" 3) "aa" 127.0.0.1:6379[1]> smembers myset1 1) "cc" 2) "hello"# 哈哈哈 weibo,b站共同關(guān)注的.. # set的差集sdiff,交集sinter,并集sunion127.0.0.1:6379[1]> SMEMBERS myset1 1) "cc" 2) "hello" 127.0.0.1:6379[1]> SMEMBERS myset 1) "hh" 2) "bb" 3) "aa" 4) "cc" 127.0.0.1:6379[1]> sdiff myset1 myset # 以myset1為參照 1) "hello" 127.0.0.1:6379[1]> sinter myset1 myset # 交集 1) "cc" 127.0.0.1:6379[1]> sunion myset1 myset # 并集 1) "bb" 2) "hh" 3) "hello" 4) "aa" 5) "cc"set的應(yīng)用:
微博,a用戶將所有關(guān)注的人放在一個set集合中。將其粉絲也放在一個集合中。
共同關(guān)注,共同愛好,二度好友,推薦好友…
Hash(哈希)
map集合。key-map 值是map集合。
set myhash field
# base garam # set myhash field value127.0.0.1:6379[1]> hset myhash name 'bitqian' age 19 # 同時設(shè)置多個值 (integer) 2 127.0.0.1:6379[1]> hget myhash name # 獲取單個值 "bitqian" 127.0.0.1:6379[1]> hget myhash age "19" 127.0.0.1:6379[1]> hgetall myhash # 獲取所有 1) "name" 2) "bitqian" 3) "age" 4) "19" 127.0.0.1:6379[1]> hmget myhash name age # 批量獲取 1) "bitqian" 2) "19"# 刪除hash中指定的鍵, 刪除后value也消失了。 hdel myhash age# 獲取長度 hlen myhash# 查看哈希中的某個鍵是否存在 hexists myhas name# 獲取所有的keys, vals hkeys myhash hvals myhas # 類型string操作。 值新增 或者 不存在才新增 hincrBy hsetnx小總結(jié):
- hash存儲變更的數(shù)據(jù) user, name, age,尤其存儲用戶信息之類的。經(jīng)常變動的信息。hash更適合于對象的存儲,string更適合字符串存儲。
Zset 有序集合
在set的基礎(chǔ)上增加了一個值。鍵是有序的。
# 新增操作127.0.0.1:6379[1]> zadd myzset 1 one (integer) 1 127.0.0.1:6379[1]> zadd myzset 2 two (integer) 1 127.0.0.1:6379[1]> zadd myzset 3 three (integer) 1 127.0.0.1:6379[1]> zrange myzset 0 -1 1) "one" 2) "two" 3) "three"# 排序如何實現(xiàn)# 新增三個人 127.0.0.1:6379[1]> zadd salary 6000 xiaoMing (integer) 1 127.0.0.1:6379[1]> zadd salary 9000 jack (integer) 1 127.0.0.1:6379[1]> zadd salary 5000 rose (integer) 1 # 按薪資從小到大排序 127.0.0.1:6379[1]> zrangebyscore salary -inf +inf 1) "rose" 2) "xiaoMing" 3) "jack"# 顯示用戶和薪資 127.0.0.1:6379[1]> zrangebyscore salary -inf +inf withscores 1) "rose" 2) "5000" 3) "xiaoMing" 4) "6000" 5) "jack" 6) "9000"# 薪水小于8000的 127.0.0.1:6379[1]> zrangebyscore salary -inf 8000 withscores 1) "rose" 2) "5000" 3) "xiaoMing" 4) "6000"### 上面都是升序。# zreverange# 降序 value 127.0.0.1:6379[1]> ZREVRANGE salary 0 -1 1) "jack" 2) "xiaoMing" 3) "rose" # 降序 127.0.0.1:6379[1]> ZREVRANGEBYSCORE salary +inf -inf withscores 1) "jack" 2) "9000" 3) "xiaoMing" 4) "6000" 5) "rose" 6) "5000"# 移除元素 zrem salary127.0.0.1:6379[1]> ZCARD salary (integer) 3# 查看元素的長度 zcard salary127.0.0.1:6379[1]> zadd salary 0 demo (integer) 1 127.0.0.1:6379[1]> zrem salary demo (integer) 1# zcount 獲取指定區(qū)間的成員數(shù)量127.0.0.1:6379[1]> zadd myset 1 aa 2 bb 3 cc (integer) 3 127.0.0.1:6379[1]> zcount myset 0 1 (integer) 1 127.0.0.1:6379[1]> zcount myset 1 3 (integer) 3多查看官網(wǎng)文檔。。。
應(yīng)用:set排序,存儲成績表,工資表排序。
普通消息:1. 重要消息 2. 帶權(quán)重進(jìn)行判斷
排行榜應(yīng)用實現(xiàn):取top n測試。
kuangshenSayJava…
總結(jié)
以上是生活随笔為你收集整理的note.. redis五大数据类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vi编辑器常用命令大全
- 下一篇: 一对多,多对多查询