redis默认有16个数据库 编号默认使用第0个 通过select 数字切换数据库
set key value //写入 key - value 键值对
get key // 获取对应key的value
select 3 //切换到第4个数据库
DBSIZE //查看数据库大小
keys * // 查看当前数据库所有的key
FLUSHALL //清空所有数据库
flushdb // 清空当前库
EXISTS key // 判断某个key是否存在 存在返回1 不存在返回0
move key 1 // 移除数据库1里的 指定key
EXPIRE key 10 //设置key的过期时间为10秒
ttl key // 查看key的剩余存在时间
type key // 看key的value是什么数据类型
APPEND key "hello" //在key的value后面追加字符串
STRLEN key //查看key的value字符串长度
redis是单线程的
redis为什么单线程还这么快
redis是将所有的数据全部放到内存中的,所以说使用单线程去操作效率就是最高的。多线程(CPU上下文会切换比较耗时)对于内存系统来说 如果没有上下文切换效率就是最高的,多次读写就都是写在一个cpu上,在内存情况下就是最佳方案。
五大数据类型
String // 字符串
List //列表
Set //集合
Hash //散列
Sorted Set //有序集合
三种特殊类型
geospatial 地理空间
hyperloglog 一种概率数据结构,用来估算不重复元素的数量
bitmaps 范围查询
String
APPEND key "hello" //在key的value后面追加字符串
STRLEN key //查看key的value字符串长度
incr key //每执行一次 自增+1
decr key // 每执行一次 自增 -1
INCRBY key 10 // 增加指定增量
DECRBY key 10 // 减少制定增量
GETRANGE key 0 3 // 查看字符串的字符范围【0.3】
SETRANGE key 1 xx // 讲字符串的指定位置的字符串替换为目标字符
setex (set with expire) // 设置过期时间
setnx(set if not exist)// 不存在再设置(在分布式锁中会常常使用)
mset key1 value1 key2 value2 key3 value3 //批量设置key1 2 3
mget key1 key2 key3 //批量获取
msetnx key1 value1 key4 value4 //批量设置key1 key4 这是一个原子性操作 要么一起成功要么一起失败
incr key / decr key 使用
127.0.0.1:6379> set views 0
ok
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> decr views
(integer) 1
127.0.0.1:6379> get views
"1"
127.0.0.1:6379> INCRBY key 10
11
127.0.0.1:6379> DECRBY key 5
6
GETRANGE key/ SETRANGE key 使用
127.0.0.1:6379> set views “hello, shui”
ok
127.0.0.1:6379> get views
“hello, shui”
127.0.0.1:6379> GETRANGE views 0 3
“hell”
127.0.0.1:6379> GETRANGE views 0 -1 // -1查看全部字符串
“hello, shui”
127.0.0.1:6379> SETRANGE views 1 xx
(integer) 10
127.0.0.1:6379> get views
“hxxllo, shui”
setex / setnx 使用
127.0.0.1:6379> setex key 30 "hello" //设置key的value是 hello 过期时间是30s
ok
127.0.0.1:6379> ttl key
30
127.0.0.1:6379> ttl key //查看剩余过期时间
26
127.0.0.1:6379> setnx mykey "hello" // 设置mykey的value为 hello
(integer) 1 //没有mykey 所以添加成功
127.0.0.1:6379> setnx mykey "shui" // 设置mykey的value为shui
(integer) 0 // mykey已经设置过了 添加失败
127.0.0.1:6379> get mykey
"hello"
mset mget msetnx 使用
127.0.0.1:6379> set k1 v1 k2 v2 k3 v3
ok
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
3) "k3"
127.0.0.1:6379> mget k1 k2
1) "v1"
2) "v2"
127.0.0.1:6379> msetnx k1 vv k4 v4
(integer) 0 //k1已经存在了,所以添加失败 因为nx是原子操作 所以k4跟着一起失败了
127.0.0.1:6379> get k4
(nil)
设置对象
//这里的key是一个巧妙的设计 user:{id}:{filed} 如此设计可以在redis中实现
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 2
ok
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "2"
// 也可以用set设置json字符串
127.0.0.1:6379> set user:1 {name:zhangsan,age:3}
复合命令
127.0.0.1:6379> getset key zhangsan //如果不存在值 返回nil 并存入值
(nil)
127.0.0.1:6379> get key
"zhangsan"
127.0.0.1:6379> getset key lisi // 如果存在值则返回旧值 并写入新值
"zhangsan"
127.0.0.1:6379> get key
"lisi"
list
在redis里面 list可以做 栈,队列、阻塞队列
ps: 所有的list的redis命令都是l开头的
LPUSH key value // 从list头部插入元素
RPUSH key value // 从list尾部插入元素
LRANGE key int1 int2 // 范围查看list内部元素 0 ~ -1为全部
LPOP key // 从头部移除list中的第一个元素
RPOP key // 从尾部移除list中的第一个元素
LINDEX key x // 通过下标x获取list中的对应值
LLEN key // 获取list 的长度
LREM key count value // 移除指定count数量的值
LTRIM key int1 int2 //接取指定下标范围内的list数据
RPOPLPUSH mylist otherList //移除mylist 列表的最后一个元素 并把它添加到otherList列表中
Lset key int1 value // 替换队列里 下标为int1的value,没有key则报错 ERR no such key 没有下标 则报错 ERR index out of range
LINSERT key BEFORE value1 value2 //在value1的前面插入value2 PS 只从表头(左侧)开始匹配,遇到第一个value为value1的值 在前面插入value2
LINSERT key AFTER value1 value2 //在value1的后面插入value2
Lpush Rpop 左边插入元素 从右边移除元素 先进先出 可以做消息队列使用
Lpush Lpop 左边插入元素 从左边移除元素 先进后出 可以做栈使用
127.0.0.1:6379> LPUSH list one // 往名为list的key里添加一个字符串 one到列表头部
(integer) 1
127.0.0.1:6379> LPUSH list two
(integer) 2
127.0.0.1:6379> LPUSH list three
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1 //查询list下所有的value 可以看到LPUSH 每次添加都添加到list的头部,即新添加的元素为第一个元素
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> LRANGE list 0 1 // 查询list下0到1两个元素value
1) "three"
2) "two"
127.0.0.1:6379> Rpush list right
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1 // 可以看到Rpush是从list的队尾添加元素
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379> LPOP list // 移除列表的第一个元素
“three”
127.0.0.1:6379> rpop list // 移除list的最后一个元素
“right”
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lindex list 1 // 通过下标获取list的对应值
“one”
127.0.0.1:6379> lindex list 0
“two”
127.0.0.1:6379> Llen list
(integer) 2
127.0.0.1:6379> LPUSH list three
(integer) 3
127.0.0.1:6379> LPUSH list three
(integer) 4
127.0.0.1:6379> LPUSH list three
(integer) 5
127.0.0.1:6379> LREM list 2 three // 移除2个three
(integer) 2
127.0.0.1:6379> LREM list 1 one // 移除一个one
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
LTRIM 示例
127.0.0.1:6379> LPUSH list one
(integer) 1
127.0.0.1:6379> LPUSH list two
(integer) 2
127.0.0.1:6379> LPUSH list three
(integer) 3
127.0.0.1:6379> LPUSH list four
(integer) 4
127.0.0.1:6379> Ltrim list 1 2 // 接取下标1 和 2之间的数据
ok
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
组合命令 RPOPLPUSH 示例
127.0.0.1:6379> LPUSH list one
(integer) 1
127.0.0.1:6379> LPUSH list two
(integer) 2
127.0.0.1:6379> LPUSH list three
(integer) 3
127.0.0.1:6379> RpopLpush list mylist
"one"
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
127.0.0.1:6379> lrange mylist 0 -1
1) "one"
Lset示例
127.0.0.1:6379> exists list // 判断list可以是否存在
(integer) 0 // list这个key还不存在
127.0.0.1:6379> lset list 0 value1
(error) ERR no such key // 未知的key
127.0.0.1:6379> lpush list value1
(integer) 1
127.0.0.1:6379> lrange list 0 0
1) "value1"
127.0.0.1:6379> lset list 0 vaiueT // 将list中下标为0的value 替换为“valueT”
ok
127.0.0.1:6379> lrange list 0 0
1) "valueT"
127.0.0.1:6379> lset list 1 valueE
(error) ERR index out of range // 下标越界
LINSERT key before/after value1 value2 示例
127.0.0.1:6379> Rpush mylist hello
(integer) 1
127.0.0.1:6379> Rpush mylist world
(integer) 2
127.0.0.1:6379> Rpush mylist world
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "world"
3) "world"
127.0.0.1:6379> linsert mylist before "world" "other" // 在world的前面插入 other
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "other"
3) "world"
4) "world"
127.0.0.1:6379> linsert mylist after world new // 在world的后面插入 new
(integer) 5
127.0.0.1:6379> lrange mylist 0 -1 // 证明linsert 只从列表头部匹配第一个元素。对于后面的元素不会生效
1) "hello"
2) "other"
3) "world"
4) "new"
5) "world"