目錄
一、認識NoSql
1、定義:
2、常見語法
3、與關系型數據庫(SQL)的區別:
二、認識Redis
1、定義:?
2、特征:
3、Key的結構:
三、安裝Redis
四、Redis常見命令
1、數據結構介紹
2、Redis的通用命令
(1)KEYS:查看符合模板的所有key
(2)DEL:刪除一個指定的key
(3)EXISTS:判斷key是否存在
(4)EXPIRE:給一個key設置有效期,有效期到期時該key會被自動刪除
(5)TTL:查看一個KEY的剩余有效期
3、String類型的命令
(1)SET:添加或者修改已經存在的一個String類型的鍵值對
(2)GET:根據key獲取String類型的value
(3)MSET:批量添加多個String類型的鍵值對
(4)MGET:根據多個key獲取多個String類型的value
(5)INCR:讓一個整型的key自增1
(6)INCRBY:讓一個整型的key自增并指定步長,例如:incrby num 2 讓num值自增2
(7)INCRBYFLOAT:讓一個浮點類型的數字自增并指定步長
(8)SETNX:添加一個String類型的鍵值對,前提是這個key不存在,否則不執行
(9)SETEX:添加一個String類型的鍵值對,并且指定有效期
4、Hash類型的命令
(1)HSET key field value:添加或者修改hash類型key的field的值
(2)HGET key field:獲取一個hash類型key的field的值
(3)HMSET:批量添加多個hash類型key的field的值
(4)HMGET:批量獲取多個hash類型key的field的值
(5)HGETALL:獲取一個hash類型的key中的所有的field和value
(6)HKEYS:獲取一個hash類型的key中的所有的field
(7)HVALS:獲取一個hash類型的key中的所有的value
(8)HINCRBY:讓一個hash類型key的字段值自增并指定步長
(9)HSETNX:添加一個hash類型的key的field值,前提是這個field不存在,否則不執行
5、List類型的命令
?(1)LPUSH key? element ... :向列表左側插入一個或多個元素
(2)LPOP key:移除并返回列表左側的第一個元素,沒有則返回nil
(3)RPUSH key? element ... :向列表右側插入一個或多個元素
(4)RPOP key:移除并返回列表右側的第一個元素
(5)LRANGE key star end:返回一段角標范圍內的所有元素
(6)BLPOP和BRPOP:與LPOP和RPOP類似,只不過在沒有元素時等待指定時間,而不是直接返回nil
6、Set類型的命令
?(1)SADD key member ... :向set中添加一個或多個元素
(2)SREM key member ... : 移除set中的指定元素
(3)SCARD key: 返回set中元素的個數
(4)SISMEMBER key member:判斷一個元素是否存在于set中
(5)SMEMBERS:獲取set中的所有元素
(6)SINTER key1 key2 ... :求key1與key2的交集
(7)SDIFF?key1 key2 ... :求key1與key2的差集
(8)SUNION?key1 key2 ... :求key1與key2的并集
7、SortedSet類型的命令
(1)ZADD key score member:添加一個或多個元素到sorted set ,如果已經存在則更新其score值
(2)ZREM key member:刪除sorted set中的一個指定元素
(3)ZSCORE key member : 獲取sorted set中的指定元素的score值
(4)ZRANK key member:獲取sorted set 中的指定元素的排名
(5)ZCARD key:獲取sorted set中的元素個數
(6)ZCOUNT key min max:統計score值在給定范圍內的所有元素的個數
(7)ZINCRBY key increment member:讓sorted set中的指定元素自增,步長為指定的increment值
(8)ZRANGE key min max:按照score排序后,獲取指定排名范圍內的元素
(9)ZRANGEBYSCORE key min max:按照score排序后,獲取指定score范圍內的元素
(10)ZDIFF、ZINTER、ZUNION:求差集、交集、并集
五、Redis的Java客戶端
1、實現jedis
(1)引入依賴
(2)建立連接,編寫yml文件
(3)測試
2、jedis連接池
3、SpringDataRedis
(1)定義
(2)實現
4、RedisTemplate
5、StringRedisTemplate
一、認識NoSql
1、定義:
NoSQL是指非關系型數據庫,在這種數據庫中,數據沒有被組織成關系表,而是以一種更靈活的方式存儲。NoSQL數據庫通常不需要預定義模式以及支持水平擴展能力,這使得它們能夠處理大規模和分布式數據。
NoSQL數據庫可分為4類:鍵值存儲、文檔存儲、列存儲和圖形數據庫。
鍵值存儲:通過在每個鍵上存儲對應的值,實現簡單的數據將數據以鍵值對的形式保存,例如Redis、Memcached等。
文檔存儲:文檔數據存儲在類似JSON的無模式格式中。文檔存儲在MongoDB、Couchbase等數據庫中。
列存儲:數據存儲在列簇中,而不是行中,適合存儲結構化和半結構化數據。例如HBase。
圖形數據庫:圖形數據庫是一種結構化數據存儲方式,用于處理圖形或半結構化數據。例如Neo4j、OrientDB等。
2、常見語法
3、與關系型數據庫(SQL)的區別:
二、認識Redis
1、定義:?
Redis是一個開源的,基于內存的鍵值對存儲數據庫,可以用作緩存、消息隊列、計數器等。
2、特征:
- 鍵值(key-value)型,value支持多種不同數據結構,功能豐富
- 單線程,每個命令具備原子性
- 低延遲,速度快(基于內存、IO多路復用、良好的編碼)。
- 支持數據持久化
- 支持主從集群、分片集群
- 支持多語言客戶端
3、Key的結構:
三、安裝Redis
安裝指南https://blog.csdn.net/icbbm/article/details/134895407?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22134895407%22%2C%22source%22%3A%22icbbm%22%7D
四、Redis常見命令
1、數據結構介紹
????????在官網( https://redis.io/commands?)可以查看到不同的命令
2、Redis的通用命令
(1)KEYS:查看符合模板的所有key
以“a”開頭
(2)DEL:刪除一個指定的key
先批量創建鍵,再做批量刪除,此時因為k4不存在,所以只刪掉3個
(3)EXISTS:判斷key是否存在
(4)EXPIRE:給一個key設置有效期,有效期到期時該key會被自動刪除
(5)TTL:查看一個KEY的剩余有效期
3、String類型的命令
(1)SET:添加或者修改已經存在的一個String類型的鍵值對
(2)GET:根據key獲取String類型的value
(3)MSET:批量添加多個String類型的鍵值對
(4)MGET:根據多個key獲取多個String類型的value
(5)INCR:讓一個整型的key自增1
(6)INCRBY:讓一個整型的key自增并指定步長,例如:incrby num 2 讓num值自增2
(7)INCRBYFLOAT:讓一個浮點類型的數字自增并指定步長
(8)SETNX:添加一個String類型的鍵值對,前提是這個key不存在,否則不執行
(9)SETEX:添加一個String類型的鍵值對,并且指定有效期
4、Hash類型的命令
Hash類型,也叫散列,其value是一個無序字典,類似于Java中的HashMap結構。
KEY | VALUE | |
field | value | |
heima:user:1 | name | Jack |
age | 21 | |
heima:user:2 | name | Rose |
age | 18 |
(1)HSET key field value:添加或者修改hash類型key的field的值
(2)HGET key field:獲取一個hash類型key的field的值
(3)HMSET:批量添加多個hash類型key的field的值
(4)HMGET:批量獲取多個hash類型key的field的值
(5)HGETALL:獲取一個hash類型的key中的所有的field和value
(6)HKEYS:獲取一個hash類型的key中的所有的field
(7)HVALS:獲取一個hash類型的key中的所有的value
(8)HINCRBY:讓一個hash類型key的字段值自增并指定步長
(9)HSETNX:添加一個hash類型的key的field值,前提是這個field不存在,否則不執行
??
5、List類型的命令
(1)LPUSH key? element ... :向列表左側插入一個或多個元素
(2)LPOP key:移除并返回列表左側的第一個元素,沒有則返回nil
(3)RPUSH key? element ... :向列表右側插入一個或多個元素
(4)RPOP key:移除并返回列表右側的第一個元素
(5)LRANGE key star end:返回一段角標范圍內的所有元素
(6)BLPOP和BRPOP:與LPOP和RPOP類似,只不過在沒有元素時等待指定時間,而不是直接返回nil
6、Set類型的命令
(1)SADD key member ... :向set中添加一個或多個元素
(2)SREM key member ... : 移除set中的指定元素
(3)SCARD key: 返回set中元素的個數
(4)SISMEMBER key member:判斷一個元素是否存在于set中
(5)SMEMBERS:獲取set中的所有元素
(6)SINTER key1 key2 ... :求key1與key2的交集
(7)SDIFF?key1 key2 ... :求key1與key2的差集
(8)SUNION?key1 key2 ... :求key1與key2的并集
7、SortedSet類型的命令
注意:所有的排名默認都是升序,如果要降序則在命令的Z后面添加REV即可
(1)ZADD key score member:添加一個或多個元素到sorted set ,如果已經存在則更新其score值
(2)ZREM key member:刪除sorted set中的一個指定元素
(3)ZSCORE key member : 獲取sorted set中的指定元素的score值
(4)ZRANK key member:獲取sorted set 中的指定元素的排名
(5)ZCARD key:獲取sorted set中的元素個數
(6)ZCOUNT key min max:統計score值在給定范圍內的所有元素的個數
(7)ZINCRBY key increment member:讓sorted set中的指定元素自增,步長為指定的increment值
(8)ZRANGE key min max:按照score排序后,獲取指定排名范圍內的元素
(9)ZRANGEBYSCORE key min max:按照score排序后,獲取指定score范圍內的元素
(10)ZDIFF、ZINTER、ZUNION:求差集、交集、并集
五、Redis的Java客戶端
1、實現jedis
(1)引入依賴
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.0.0</version></dependency>
(2)建立連接,編寫yml文件
spring:redis:host: 192.168.248.152port: 6379password: 1234lettuce:pool:max-active: 8max-idle: 8min-idle: 0max-wait: 100ms
(3)測試
@Testvoid testSaveUser() {// 寫入數據redisTemplate.opsForValue().set("user:100", new User("哥", 21));// 獲取數據User o = (User) redisTemplate.opsForValue().get("user:100");System.out.println("o = " + o);}
2、jedis連接池
3、SpringDataRedis
(1)定義
SpringData是Spring中數據操作的模塊,包含對各種數據庫的集成,其中對Redis的集成模塊就叫做SpringDataRedis,官網地址:Spring Data Redis
- 提供了對不同Redis客戶端的整合(Lettuce和Jedis)
- 提供了RedisTemplate統一API來操作Redis
- 支持Redis的發布訂閱模型
- 支持Redis哨兵和Redis集群
- 支持基于Lettuce的響應式編程
- 支持基于JDK、JSON、字符串、Spring對象的數據序列化及反序列化
- 支持基于Redis的JDKCollection實現
API | 返回值類型 | 說明 |
redisTemplate.opsForValue() | ValueOperations | 操作String類型數據 |
redisTemplate.opsForHash() | HashOperations | 操作Hash類型數據 |
redisTemplate.opsForList() | ListOperations | 操作List類型數據 |
redisTemplate.opsForSet() | SetOperations | 操作Set類型數據 |
redisTemplate.opsForZSet() | ZSetOperations | 操作SortedSet類型數據 |
redisTemplate | 通用的命令 |
(2)實現
1.引入依賴
<!--redis依賴--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
<!--common-pool--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency>
2.配置yml文件
spring:redis:host: 192.168.248.152port: 6379password: 1234lettuce:pool:max-active: 8max-idle: 8min-idle: 0max-wait: 100ms
3.注入RedisTemplate
@Autowired
private RedisTemplate redisTemplate;
4.測試
@Testvoid testString() {// 寫入一條String數據redisTemplate.opsForValue().set("name", "虎哥");// 獲取string數據Object name = redisTemplate.opsForValue().get("name");System.out.println("name = " + name);}
4、RedisTemplate
缺點:
- 可讀性差
- 內存占用較大
自定義RedisTemplate的序列化方式代碼:
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){// 創建RedisTemplate對象RedisTemplate<String, Object> template = new RedisTemplate<>();// 設置連接工廠template.setConnectionFactory(connectionFactory);// 創建JSON序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// 設置Key的序列化template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());// 設置Value的序列化template.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);// 返回return template;}
}
5、StringRedisTemplate
手動序列化:
@Testvoid testSaveUser() throws JsonProcessingException {// 創建對象User user = new User("虎哥", 21);// 手動序列化String json = mapper.writeValueAsString(user);// 寫入數據stringRedisTemplate.opsForValue().set("user:200", json);// 獲取數據String jsonUser = stringRedisTemplate.opsForValue().get("user:200");// 手動反序列化User user1 = mapper.readValue(jsonUser, User.class);System.out.println("user1 = " + user1);}