这是我多年前写的学习笔记,希望能帮到大家, Redis 是一个基于内存的键值存储系统,可以用于存储、访问和操作各种类型的数据。在 Redis 中,每个键都与一个特定的值相关联,这些值可以是字符串、哈希、列表、集合、有序集合等不同的数据结构。
开启服务
$sudo ./src/redis-server &
##################################
键值操作
##################################
- 定义并赋值变量苹果的数量
$ redis-cli set dangcheng::apple::count 152
OK
- 获取刚才的苹果数量
$ redis-cli get dangcheng::apple::count
"152"
- 当苹果数量增加1 incr关键字实际上是increment的简写
$ redis-cli incr dangcheng::apple::count
(integer) 153
- 当苹果来了一盒,而这盒苹果共7个则我们需要加上指定数量关键字是incrby
$ redis-cli incrby dangcheng::apple::count 7
(integer) 160
- 如果set一个php数组 我们可以使用php函数serialize将对象序列化后写入
$age=array("Bill"=>"35","Steve"=>"37","Peter"=>"43");
$age_str = seriallze($age);//将这个结果写入redias中
$age = unseriallze($age_str);//get获取后我们可以使用unseriallze反序列化把其转换为PHP对象
EXISTS key 是否存在
- 存在返回 1
$ redis-cli exists dangcheng::apple::count
(integer) 1
- 不存在返回 0
$ redis-cli exists dangcheng::apple::color
(integer) 0
DUMP序列化值 不包含任何生命周期信息
- 不存在返回nil
$ redis-cli dump dangcheng::apple::color
(nil)
- 返回序列化结果
$ redis-cli dump dangcheng::apple::count
"\x00\xc1\xa0\x00\x06\x00\xb0t6\xdaT\x99#\xa2"
expire 和 ttl 设置生命期和查看剩余时间
- TTL命令是查询生存时间剩余,不设置生存时间返回-1代表永久
$ redis-cli ttl dangcheng::apple::count
(integer) -1
- 用expire设置生存时间剩余366秒
$ redis-cli expire dangcheng::apple::count 366 (integer) 1
- 写这段的过程中消耗了127秒
$ redis-cli ttl dangcheng::apple::count (integer) 239
- PS1:此外还有PEXPIRE命令与expire功能是一样的,只是设置是以毫秒为单位
- PS2:此外还有PTTL命令与TTL功能是一样的,只是显示是以毫秒为单位
expireat
- 此命令不同于expire去设定剩余,而是直接设置当前key什么时候死亡 而参数是linux时间戳表示
- PS:pexpireat 命令与expireat命令等效,区别是单位精确到毫秒数的unix时间戳
keys 查找所有符合给定模式 pattern 的 key
- KEYS * 匹配数据库中所有 key 。
- KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
- KEYS h*llo 匹配 hllo 和 heeeeello 等。
- KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
- 特殊符号用 \ 隔开
$ redis-cli keys dangcheng::*
1) "dangcheng::apple::color"
2) "dangcheng::apple::count"
migrate 将当前redis实例中的对象迁移到另一个host下的对应端口的实例【数据的迁移】
- 在本机8888端口创建另一个redis服务
$ redis-server --port 8888 &
[1] 13086
- 原有实例中存在
$ redis-cli
127.0.0.1:6379> keys dangcheng::*
1) "dangcheng::apple::color"
2) "dangcheng::apple::count"
- 8888端口下的实例中找不到数据
$ redis-cli -p 8888 127.0.0.1:8888> keys dangcheng* (empty list or set)
- 将源实例中的数据count传入8888端口的实例
127.0.0.1:6379> migrate 127.0.0.1 8888 dangcheng::apple::count 0 -1 OK
- 源实例中的count不见了,证明传输源会被删掉
127.0.0.1:6379> keys dangcheng*
1) "dangcheng::apple::color"`
- 在8888端口下的实例中查到了 `127.0.0.1:8888> get dangcheng::apple::count "25"
# move 将数据从一个db空间中迁移到另一个db空间中
* 选择index0的dbspace
127.0.0.1:6379> select 0 OK 127.0.0.1:6379> keys *
- "dangcheng::apple::color"
- "test::first"
* 移动到index1的dbspace
.0.0.1:6379> move test::first 1 (integer) 1 127.0.0.1:6379> keys *
- "dangcheng::apple::color" 127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> keys *
- "test::first"
* 我们看到了的确在dbsopace1中查询到了
127.0.0.1:6379[1]> get test::first "556779"
* PS:要注意的是如果target db 有相同的key 则移动不会成功
# OBJECT 对象操作
* 返回给定 key 引用所储存的值的次数。此命令主要用于除错
127.0.0.1:6379[1]> object refcount test::first (integer) 1
* 返回给定 key 锁储存的值所使用的内部表示(representation)。
127.0.0.1:6379[1]> object encoding test::first "int" 127.0.0.1:6379[1]> set str 'hello redis!' OK 127.0.0.1:6379[1]> object encoding str "raw"
* 返回给定 key 自储存以来的空闲时间(idle, 没有被读取也没有被写入),以秒为单位
127.0.0.1:6379[1]> object idletime str (integer) 236
* 对象可以以多种方式编码:
* 字符串可以被编码为 raw (一般字符串)或 int (为了节约内存,Redis 会将字符串表示的 64 位有符号整数编码为整数来进行储存)。
* 列表可以被编码为 ziplist 或 linkedlist 。 ziplist 是为节约大小较小的列表空间而作的特殊表示。
* 集合可以被编码为 intset 或者 hashtable 。 intset 是只储存数字的小集合的特殊表示。
* 哈希表可以编码为 zipmap 或者 hashtable 。 zipmap 是小哈希表的特殊表示。
* 有序集合可以被编码为 ziplist 或者 skiplist 格式。 ziplist 用于表示小的有序集合,而 skiplist 则用于表示任何大小的有序集合。
# persist 将一个key的超时时间变为永久
* 使用expire 给对象设置生存时间
127.0.0.1:6379[1]> expire test::first 3600 (integer) 1
* 查询剩余时间
127.0.0.1:6379[1]> ttl test::first (integer) 3597 127.0.0.1:6379[1]> persist test::first (integer) 1```
- 的确变为了持久化key
127.0.0.1:6379[1]> ttl test::first
(integer) -1
- randomkey 随机抽取一个key
127.0.0.1:6379> randomkey
"dangcheng::apple::color2"
127.0.0.1:6379> randomkey
"dangcheng::apple::color"
127.0.0.1:6379> randomkey
"dangcheng::apple::color1"
mset[multi set] 批量设置
127.0.0.1:8888> mset a 'aaa' b 'bbb' c 'cccc'
OK
- 查询所有key
127.0.0.1:8888> keys *
1) "dangcheng::apple::count"
2) "o"
3) "a"
4) "b"
5) "c"
- 清空dbspace
127.0.0.1:8888> flushdb
OK
- 查看所有,很显然没有了
127.0.0.1:8888> keys *
(empty list or set)
rename 修改key名字
$ 127.0.0.1:6379> set a 'aaa'
OK
$ 127.0.0.1:6379> rename a b
OK
$ 127.0.0.1:6379> get a
(nil)
$ 127.0.0.1:6379> get b
"aaa"
renamenx 目标key一旦已存在不会被覆盖 只有空的key才能成为target
127.0.0.1:6379> renamenx b c
(integer) 0
127.0.0.1:6379> get c
"66"
127.0.0.1:6379> get b
"bb"
127.0.0.1:6379> renamenx b d
(integer) 1
127.0.0.1:6379> get d
"bb"
127.0.0.1:6379> getb
(error) ERR unknown command 'getb'
127.0.0.1:6379> get b
(nil)
dump&restore 序列化和反序列化
127.0.0.1:6379> dump c
"\x00\xc0B\x06\x00\xac\x15Y\x1aO<B\xa5"
127.0.0.1:6379> get c
"66"
- 序列化c中的值
127.0.0.1:6379> dump c
"\x00\xc0B\x06\x00\xac\x15Y\x1aO<B\xa5"`
* 通过反序列化一个值创建新的键 newc
```127.0.0.1:6379> restore newc 0 "\x00\xc0B\x06\x00\xac\x15Y\x1aO<B\xa5"
OK
127.0.0.1:6379> get newc
"66"
sort [asc|desc] [alpha][limit]给一个列表进行排序 默认为asc方式,使用alpha方式可以给字符串进行排序,此外还可以使用limit进行范围限制
- lpush 是用于创建一个列表的命令
127.0.0.1:6379> lpush sort_list 15 2 45 20 16 3 7 9
(integer) 8
127.0.0.1:6379> sort sort_list
1) "2"
2) "3"
3) "7"
4) "9"
5) "15"
6) "16"
7) "20"
8) "45"
127.0.0.1:6379> sort sort_list asc
1) "2"
2) "3"
3) "7"
4) "9"
5) "15"
6) "16"
7) "20"
8) "45"
127.0.0.1:6379> sort sort_list desc
1) "45"
2) "20"
3) "16"
4) "15"
5) "9"
6) "7"
7) "3"
8) "2"
type 查看key的数据类型
- @return none (key不存在) |string (字符串)|list (列表)|set (集合)|zset (有序集)|hash (哈希表)
$ 127.0.0.1:6379> type sort_list
list
$ 127.0.0.1:6379> type c
string
补充说明:该文是我多年前写的一片关于redis基础练习的记录,犹豫当前发布的站点程序更新导致排版混乱,此时我本着负责的态度,对排版进行了重新梳理,虽然收藏的人并不多,但是我还是要把这件事做了,希望能帮到其他人