1. 背景
本文简要介绍 Redis 和完成一个示例。
2.知识
Redis(Remote Dictionary Server ),即远程字典服务。它是一个key-value存储系统。它是内存数据存储,因此很快,常常作为缓存使用。
特点:
- key-value存储系统, 支持多种数据结构
- 数据都是缓存在内存中,周期性存储到磁盘
- Redis支持主从同步
Redis 是一个键值对存储:
- Key 定义了如何标识数据块。
- Values 表示 key指向的 实际数据。Values 可以是任何类型,可以存储字符串,整数,或序列化对象(比如 JSON, XML )
指令格式:
set key value
比如: set kk1 vv1 就代表了 将值 vv1 存放在 kk1 为key 的位置。可以直接 get 取出。
get kk1
持久化
- Redis 基于一定量 key 的变更,来触发对数据库进行快照,保存到硬盘上
- Redis 支持增量模式
客户端连接工具:
- 它自带了一个客户端工具: redis-cli
- 也可以选择 QuickRedis 工具。
事务(Transactions)
Redis 所有的命令都是原子性的,包括那些一次可以执行多项操作的命令也一样。此外,在使用多命令的时候,Redis 支持事务。
Redis 确实是单线程的,这就是为什么每个命令都是原子性的原因。
一次只能执行一个命令
事务的使用
使用 multi 命令, 作为开始。 使用 exec 执行命令。或者 discard 来放弃取消执行。
multi
hincrby groups:1percent balance -9000000000
hincrby groups:99percent balance 9000000000
exec
key 的过期时间
- expire 可以指定一个 key 的过期时间。
- ttl 命令 可以找出一条数据还能活多久
127.0.0.1:6379> set page 30
OK
127.0.0.1:6379> expire page 10
1
127.0.0.1:6379> ttl page
23
setex 名字,写入一个值的同时指定过期时间,示例:
127.0.0.1:6379> setex ppp 10 'hello'
OK
127.0.0.1:6379> ttl ppp
4
3. 安装
请参考:https://www.jianshu.com/p/52350a764bd3
本文略。
4. 使用命令行操作 redis 的示例
4.1 使用 redis-cli
编译后的 redis-cli 在你的 redis-6.2.4/src 文件夹下,使用它连接Redis服务。
4.2 使用密码连接到指定redis
./redis-cli -h 127.0.0.1 -a 123456 --raw
-h 后是服务器地址
-a 是密码
--raw 用来显示中文
4.3 选择一个“库”
在 Redis 中,通过一个数字来标识数据库,默认开始标识是 0。
127.0.0.1:6379> select 1
OK
4.4 使用"命令字"
示例:
127.0.0.1:6379[1]> set k1 v1
OK
127.0.0.1:6379[1]> get k1
"v1"
写一个 json 格式的:
127.0.0.1:6379[1]> set users:zhang3 '{"name":"zhang3" "age":16 }'
OK
像上面的 users:zhang3 ,用冒号分割是一种约定习惯,前面表达一个分类,这里表达了“一个叫zhang3的用户”。这是可选的行为。
5. Redis 的五种数据结构
五种数据结构:
- (1) Strings (字符串结构)
- (2) Hashes (哈希结构)
- (3) Lists (列表结构)
- (4) Sets (集合结构)
- (5) Sorted Sets (有序集合结构)
5.1 字符串类型 ( Strings )
指令字有:
- set 写入
- get 取出
- strlen 获得长度
- getrange 获得范围区间
- append 在尾部追加
示例:
127.0.0.1:6379> set txt1 '白日依山尽,黄河入海流。欲穷千里目,更上一层楼'
OK
127.0.0.1:6379> get txt1
白日依山尽,黄河入海流。欲穷千里目,更上一层楼
127.0.0.1:6379> strlen txt1
69
127.0.0.1:6379> getrange txt1 18 24
黄河?
append txt1 ' --- 唐诗一首'
127.0.0.1:6379> get txt1
白日依山尽,黄河入海流。欲穷千里目,更上一层楼 --- 唐诗一首
value 可以是数字
如果value 是数字的话,可以做做累加。
指令字:
- incr 累加1
- incrby 增加指定数字
127.0.0.1:6379> set age 1
OK
127.0.0.1:6379> get age
1
127.0.0.1:6379> incr age
2
127.0.0.1:6379> incrby age 10
12
5.2 Hashes (哈希结构)
对至值的内容 可以是一个 Hash 表,类似 Java 里的 HashMap
格式:
hset key field value [fileld value]
指令字:
- hset 写入
- hget 取出
- hdel 删除一个字段
- hkeys 获得所有 key
- hgetall 后的所有内容
field 和 value 可以多个键值对。
示例:
127.0.0.1:6379> hset zhang3 name zhang3 age 16
2
# 获取全部
127.0.0.1:6379> hgetall zhang3
name
zhang3
age
16
127.0.0.1:6379> hget zhang3 name
zhang3
127.0.0.1:6379> hkeys zhang3
name
age
# 删除字段
127.0.0.1:6379> hdel zhang3 age
1
5.3 Lists (列表结构)
它的 value 以数组形式的 存储。不过它更类似一个双向链表。
指令字有:
- lpush 从左侧 push
- rpush 从右侧 push
- lrange 查看指定范围的元素
- ltrim 仅保留
- llen 查看长度
示例:
127.0.0.1:6379> lpush duiwu1 zhang3 li4
2
127.0.0.1:6379> lpush duiwu1 wang5
3
127.0.0.1:6379> llen duiwu1
3
127.0.0.1:6379> lrange duiwu1 0 3
wang5
li4
zhang3
5.4 Sets (集合结构)
集合结构被用于存储唯一值。
集合是无序的。
它提供了一组基于集合的操作,比如说并集运算。
集合非常适用于:
- 需要标记或者跟踪那些有重复属性的值的时候。
- 或者我们希望使用集合的交并操作的时候。
指令字:
- sadd 添加
- sismember 检索
- sinter 交集
示例:
127.0.0.1:6379> sadd zhang3_friedns li4 wang5
2
127.0.0.1:6379> sadd wang5_friends li4 zhao6
2
127.0.0.1:6379> sismember zhang3_friedns li4
1
127.0.0.1:6379> sinter zhang3_friedns wang5_friends
li4
5.4 Sorted Sets (有序集合结构)
有序集合结构就像集合结构一样,但是有权重(score)。
权重提供了排序和排名功能
指令字:
- zadd 添加
- zcount 计算一个区间的数量
- zrank 排在第几名
- zrevrank 倒序排名
127.0.0.1:6379> zadd paiming 80 zhangsan 70 lisi 30 anni
3
127.0.0.1:6379> zcount paiming 0 60
1
127.0.0.1:6379> zrevrank paiming anni
2
127.0.0.1:6379> zrank paiming anni
0
5.5 其他扩展
keys : 按模式搜索有哪些key
127.0.0.1:6379> keys *
paiming
age
zhang3
duiwu1
6. Java 操作 Redis
本文太长了,参考我的另一篇文章:https://www.jianshu.com/p/52c72b720062
网友评论