Redis(一) Markdown 语法学习:[链接] 一 :Redis 安装与启动 Redis 下载与安装参考 博客:[链接] 在将 Redis 解压缩后的目录下,打开 cmd Redis 服务启动命令 : redis-server.exe redis.windows.conf 连接 Redis:redis-cli. ..

《Redis 深度历险》读书笔记 -- 之基本数据结构

Redis(一)

Markdown 语法学习:https://www.jianshu.com/p/191d1e21f7ed

一 :Redis 安装与启动

Redis 下载与安装参考 博客:https://www.cnblogs.com/jylee/p/9844965.html

在将 Redis 解压缩后的目录下,打开 cmd
Redis 服务启动命令 : redis-server.exe redis.windows.conf
连接 Redisredis-cli.exe -h 127.0.0.1 -p 6379
或者直接在文件夹中打开redis-cli.exe
如果没配置环境变量的话连接 Redis 的指令,必须在 Redis 解压路径下打开 cmd


二 : Redis 基本数据类型

参考教程:https://www.runoob.com/redis/redis-data-types.html
参考书籍:https://book.douban.com/subject/30386804/
我这不能算参考了,基本上算是比着书敲了一遍,第一次写博文,也分不太清重点不重点的,见谅。见谅。。

1、String(字符串)

Redis 的字符串是动态的、可以修改的,内部机构的实现类似于 Java 的 ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配

基本操作

**键值对:**相当于字典的 key、value,支持简单的 crud,下面的 name--key codehole--value

127.0.0.1:6379> set name codehole
OK
127.0.0.1:6379> get name
"codehole"
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)

批量键值对 : 可对多个字符串进行批量操作,节省网络耗时开销

127.0.0.1:6379> set name1 codehole
OK
127.0.0.1:6379> set name2 holycoder
OK
127.0.0.1:6379> mget name1 name2 name3
1) "codehole"
2) "holycoder"
3) (nil)
127.0.0.1:6379> mset name1 boy name2 girl name3 unkonwn
OK
127.0.0.1:6379> mget name1 name2 name3
1) "boy"
2) "girl"
3) "unkonwn"

过期和 set 命令扩展 :可对 key 设置过期时间,到时间自动删除,常用做控制缓存的实效时间

127.0.0.1:6379> set name codehole
OK
127.0.0.1:6379> expire name 5 #设置name的过期时间5秒
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> setex name 5 codehole #set 与expire 结合起来用
OK
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> setnx name codehole #如果name不存在就执行set创建
(integer) 1
127.0.0.1:6379> get name
"codehole"
127.0.0.1:6379> setnx name holycoder #如果存在就不执行
(integer) 0
127.0.0.1:6379> get name
"codehole"

计数 :若 value 是整数 , 还可进行自增操作,范围在 signed long 最大值与最小值之间

127.0.0.1:6379> set age 30
OK
127.0.0.1:6379> incr age
(integer) 31
127.0.0.1:6379> incrby age 5
(integer) 36
127.0.0.1:6379> incrby age -5
(integer) 31

基本操作整理


2、Hash(哈希字典)

在看这一部分时,讲到了 rehash,以及 Redis 中的 rehash 与 Java 中 rehash 的区别,这里没看懂,也不清楚 rehash 是什么,回头需要再补一补。

hash 结构的存储消耗要高于单个字符串,到底要使用 hash 还是字符串需要根据实际情况再三权衡

基本操作
127.0.0.1:6379> hset books java "think in java"
(integer) 1
127.0.0.1:6379> hset books golang "concurrency in go"
(integer) 1
127.0.0.1:6379> hset books python "python cookbook"
(integer) 1
127.0.0.1:6379> hgetall books
1) "java"
2) "think in java"
3) "golang"
4) "concurrency in go"
5) "python"
6) "python cookbook"
127.0.0.1:6379> hlen books
(integer) 3
127.0.0.1:6379> hget books java
"think in java"
127.0.0.1:6379> hset books golang "learning go programming"
(integer) 0
127.0.0.1:6379> hget books golang
"learning go programming"
127.0.0.1:6379> hmset books java "effective java" python "learning python"
OK

基本操作整理


3、List(列表)

当列表弹出了最后一个元素之后,该数据结构被自动删除,内存被回收

基本操作

右边进左边出:队列先进先出,常用做消息排队和异步逻辑处理,确保了元素的访问顺序性

127.0.0.1:6379> rpush books python java golang
(integer) 3
127.0.0.1:6379> llen books
(integer) 3
127.0.0.1:6379> lpop books
"python"
127.0.0.1:6379> lpop books
"java"
127.0.0.1:6379> lpop books
"golang"
127.0.0.1:6379> lpop books
(nil)

右边进右边出:栈后进后出,业务中并不太常见

127.0.0.1:6379> rpush books python java golang
(integer) 3
127.0.0.1:6379> rpop books
"golang"
127.0.0.1:6379> rpop books
"java"
127.0.0.1:6379> rpop books
"python"
127.0.0.1:6379> rpop books
(nil)

慢操作

127.0.0.1:6379> rpush books python java golang
(integer) 3
127.0.0.1:6379> lindex books 1 #同java链表的get(index),需要对链表进行遍历
"java"
127.0.0.1:6379> lrange books 0 -1 #获取所有元素
1) "python"
2) "java"
3) "golang"
127.0.0.1:6379> ltrim books 1 -1 #保留区间内值
OK
127.0.0.1:6379> lrange books 0 -1
1) "java"
2) "golang"
127.0.0.1:6379> ltrim books 1 0 #清空列表,因为长度为负
OK
127.0.0.1:6379> llen books
(integer) 0

基本操作整理


4、Set(集合)

内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值 null。
当集合中的最后一个元素被移除之后秘书局结构被自动删除,内存被回收

基本操作
127.0.0.1:6379> sadd books python
(integer) 1
127.0.0.1:6379> sadd books python
(integer) 0
127.0.0.1:6379> sadd books java golang
(integer) 2
127.0.0.1:6379> smembers books
1) "golang"
2) "java"
3) "python"
127.0.0.1:6379> sismember books java
(integer) 1
127.0.0.1:6379> sismember books rust
(integer) 0
127.0.0.1:6379> scard books
(integer) 3
127.0.0.1:6379> spop books
"python"
127.0.0.1:6379> scard books
(integer) 2

基本操作整理


5、zSet(有序集合/有序列表)

内部实现是一种叫作“跳跃列表”的数据结构
zset 中最后一个 value 被移除后,数据结构被自动删除,内存被回收

基本操作
127.0.0.1:6379> zadd books 9.0 "think in java"
(integer) 1
127.0.0.1:6379> zadd books 8.9 "java concurrency"
(integer) 1
127.0.0.1:6379> zadd books 8.6 "java cookbook"
(integer) 1
127.0.0.1:6379> zrange books 0 -1
1) "java cookbook"
2) "java concurrency"
3) "think in java"
127.0.0.1:6379> zrevrange books 0 -1
1) "think in java"
2) "java concurrency"
3) "java cookbook"
127.0.0.1:6379> zcard books
(integer) 3
127.0.0.1:6379> zscore books "java concurrency"
"8.9000000000000004"
127.0.0.1:6379> zrank books "java concurrency"
(integer) 1
127.0.0.1:6379> zrangebyscore books 0 8.91
1) "java cookbook"
2) "java concurrency"
127.0.0.1:6379> zrangebyscore books -inf 8.91 withscores
1) "java cookbook"
2) "8.5999999999999996"
3) "java concurrency"
4) "8.9000000000000004"
127.0.0.1:6379> zrem books "java concurrency"
(integer) 1
127.0.0.1:6379> zrange books 0 -1
1) "java cookbook"
2) "think in java"

基本操作整理


今日未解决问题
  1. Redis 中的 rehash
  2. Redis 中的 rehash 与 Java 中 rehash 的区别
  3. 跳跃列表

  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    143 引用 • 209 回帖 • 802 关注
  • 中间件
    3 引用 • 1 回帖
回帖   
请输入回帖内容...