Redis基本知识
开启进入redis
进入redis所在目录
cd /usr/local/bin
执行命令
redis-server lconfig/redis.conf
redis-cli
redis性能测试
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
redis默认有16个数据库,默认使用第一个数据库,可使用select命令更改数据库
dbsize可查看数据库大小
flushdb清除当前数据库,flushall清除所有数据库
redis是单线程的,redis是基于内存操作的,redis的瓶颈不是CPU,而是机器的内存和网络的带宽
Redis是c语言写的,官方提供的是10W+的QPS,完全不比同样使用key-value的MemeCache差
Redis单线程还这么快的原因:
误区1:单线程一定比多线程慢(多线程CPU上下文会切换
误区2:高性能的服务器一定是多线程的
Redis是将所有的数据全部放在内存中,所以单线程效率是最高的
Redis的基本命令
Redis五大数据类型
Redis-Key、
查看所有key
keys *
set key
set key value
判断是否存在key
exists key
移除当前的key
move key
指定key的过期时间
expire key time(单位是秒)
查看当前key的类型
type key
查看当前key的剩余过期时间
ttl key
String
127.0.0.1:6379[1]> set key1 v1//设置值
OK
127.0.0.1:6379[1]> get key1//获取值
"v1"
127.0.0.1:6379[1]> exists key1//查看值是否存在
(integer) 1
127.0.0.1:6379[1]> append key1 hello//字符串后面追加
(integer) 7
127.0.0.1:6379[1]> get key1
"v1hello"
127.0.0.1:6379[1]> strlen key1//获取字符串的长度
(integer) 7
127.0.0.1:6379[1]> append key1 txl
(integer) 10
127.0.0.1:6379[1]> strlen key1
(integer) 10
127.0.0.1:6379[1]>
127.0.0.1:6379[1]> set views 1
OK
127.0.0.1:6379[1]> incr views
(integer) 2
127.0.0.1:6379[1]> get views
"2"
127.0.0.1:6379[1]> decr views
(integer) 1
127.0.0.1:6379[1]> get views
"1"
127.0.0.1:6379[1]> incrby views 10
(integer) 11
127.0.0.1:6379[1]> decrby views 20
(integer) -9
127.0.0.1:6379[1]>
使值加一
incr key
使值减一
decr key
加任意
incrby key n(要加的数量)
减去任意
decrby key n
截取字符串的子串
"hello"
127.0.0.1:6379[1]> getrange k1 0 2
"hel"
127.0.0.1:6379[1]> getrange k1 0 -1
"hello"
127.0.0.1:6379[1]>
getrange start(从0开始) end
获取整段字符串
getrange 0 -1
替换字符串的子串
127.0.0.1:6379[1]> set k2 abcdef
OK
127.0.0.1:6379[1]> get k2
"abcdef"
127.0.0.1:6379[1]> setrange k2 2 xxx
(integer) 6
127.0.0.1:6379[1]> get k2
"abxxxf"
setrange key start(下标从零开始) str(要替换的字符串)
设置过期时间的键值对
setex key second value
如果存在就不会覆盖(执行失败),不存在会创建
setnx key value
批量创建键值对
127.0.0.1:6379[1]> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379[1]> keys *
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6379[1]>
mset k1 v1 k2 v2 k3 v3
批量获取值
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379>
mget k1 k2 k3
msetnx是一个原子性的操作,要么全部设置成功,要么全部失败
对象
127.0.0.1:6379> mset user:1:name txl user:1:age 21
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "txl"
2) "21"
先获取值,在设置值
127.0.0.1:6379> getset db redis
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb
"redis"
127.0.0.1:6379> get db
"mongodb"
getset key value
List
所有的list命令都是以l开头的
添加元素,可以添加重复元素
lpush key value
27.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> lrange list 0 -1
1) "three"
2) "two"
3) "one"
lpush放到头部,rpush放到尾部
127.0.0.1:6379> rpush list right
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
lpop移除列表第一个元素,rpop移除列表最后一个元素
127.0.0.1:6379> lpop list
"three"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
3) "right"
127.0.0.1:6379> rpop list
"right"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
根据下标获取值
lindex list index
127.0.0.1:6379> lindex list 1
"one"
127.0.0.1:6379> lindex list 0
"two"
移除指定的值
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "e1"
3) "two"
4) "one"
127.0.0.1:6379> lrem list 2 one
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "e1"
3) "two"
lrem key count value
去除两边的多余字符
127.0.0.1:6379> rpush list1 "hello"
(integer) 1
127.0.0.1:6379> rpush list1 "hello1"
(integer) 2
127.0.0.1:6379> rpush list1 "hello2"
(integer) 3
127.0.0.1:6379> rpush list1 "hello3"
(integer) 4
127.0.0.1:6379> lrange list1 0 -1
1) "hello"
2) "hello1"
3) "hello2"
4) "hello3"
127.0.0.1:6379> ltrim list1 1 2
OK
127.0.0.1:6379> lrange list1 0 -1
1) "hello1"
2) "hello2"
ltrim key start end
移除一个list的最后一个元素,将它移动到另一个list
127.0.0.1:6379> lrange list1 0 -1
1) "hello"
2) "hello1"
3) "hello2"
127.0.0.1:6379> rpush list1 "hello3"
(integer) 4
127.0.0.1:6379> lrange list1 0 -1
1) "hello"
2) "hello1"
3) "hello2"
4) "hello3"
127.0.0.1:6379> rpoplpush list1 list2
"hello3"
127.0.0.1:6379> lrange list1 0 -1
1) "hello"
2) "hello1"
3) "hello2"
127.0.0.1:6379> lrange list2 0 -1
1) "hello3"
rpoplpush list1 list2
更新当前list里面的值
127.0.0.1:6379> lset list1 0 hhhh
OK
127.0.0.1:6379> lrange list1 0 -1
1) "hhhh"
2) "hello1"
3) "hello2"
前提是键值存在,不然会执行错误
lset key index value
插入元素
127.0.0.1:6379> lrange list1 0 -1
1) "hhhh"
2) "hello1"
3) "hello2"
127.0.0.1:6379> linsert list1 before hhhh hahaha
(integer) 4
127.0.0.1:6379> lrange list1 0 -1
1) "hahaha"
2) "hhhh"
3) "hello1"
4) "hello2"
linsert key before/after value1 value2
Set
添加元素
127.0.0.1:6379> sadd set hello
(integer) 1
127.0.0.1:6379> sadd set txllg
(integer) 1
sadd key value
查看set里面的元素
127.0.0.1:6379> smembers set
1) "txllg"
2) "hello"
smembers key
判断元素是否在set集合中
127.0.0.1:6379> sismember set hello
(integer) 1
127.0.0.1:6379> sismember set hhh
(integer) 0
sismember key value
查看set元素数量及删除元素
127.0.0.1:6379> scard set
(integer) 2
127.0.0.1:6379> srem set hello
(integer) 1
127.0.0.1:6379> smembers set
1) "txllg"
查看数量 scard key
删除元素 srem set hello
随机抽取元素
127.0.0.1:6379> SRANDMEMBER set 1
1) "hhh"
127.0.0.1:6379> SRANDMEMBER set 1
1) "hhh"
127.0.0.1:6379> SRANDMEMBER set 1
1) "txllg"
srandmember key count
随机删除元素
127.0.0.1:6379> spop set
"hhh"
spop key
将一个set的元素移动到另一个set中
127.0.0.1:6379> sadd set2 hl
(integer) 1
127.0.0.1:6379> SMOVE set set2 txllg
(integer) 1
127.0.0.1:6379> smembers set
(empty array)
127.0.0.1:6379> smembers set2
1) "txllg"
2) "hl"
smove source destination value
两个set的差集key1-key2
127.0.0.1:6379> sadd set1 a
(integer) 1
127.0.0.1:6379> sadd set1 b
(integer) 1
127.0.0.1:6379> sadd set1 c
(integer) 1
127.0.0.1:6379> sadd set2 c
(integer) 1
127.0.0.1:6379> sadd set2 d
(integer) 1
127.0.0.1:6379> sadd set2 e
(integer) 1
127.0.0.1:6379> sdiff set1 set2
1) "a"
2) "b"
127.0.0.1:6379> sdiff set2 set1
1) "d"
2) "e"
sdiff key1 key2
交集和并集
127.0.0.1:6379> sinter set1 set2
1) "c"
127.0.0.1:6379> sunion set1 set2
1) "a"
2) "b"
3) "e"
4) "d"
5) "c"
交集sinter key1 key2
并集union key1 key2
Hash
添加和获取元素
127.0.0.1:6379> hset hash1 field1 value1 field2 value2
(integer) 2
127.0.0.1:6379> hget hash1 field1
"value1"
127.0.0.1:6379> hget hash1 field2
"value2"
127.0.0.1:6379> hgetall hash1
1) "field1"
2) "value1"
3) "field2"
4) "value2"
hset key field value
hget key field
hegtall key
删除元素
127.0.0.1:6379> hgetall hash1
1) "field1"
2) "value1"
3) "field2"
4) "value2"
127.0.0.1:6379> hdel hash1 field1
(integer) 1
127.0.0.1:6379> hgetall hash1
1) "field2"
2) "value2"
hdel key field
查看指定元素是否存在
127.0.0.1:6379> HEXISTS hash1 h
(integer) 0
127.0.0.1:6379> HEXISTS hash1 field2
(integer) 1
hexists key field
获取所有的key
127.0.0.1:6379> hkeys hash1
1) "field2"
2) "field3"
3) "field4"
hkeys key
获取所有的value
127.0.0.1:6379> hvals hash1
1) "value2"
2) "value3"
3) "value4"
hvals hash1
指定自增
127.0.0.1:6379> hset hash1 field1 2
(integer) 1
127.0.0.1:6379> HINCRBY hash1 field1 10
(integer) 12
hincrby key field n
Zset
添加查看元素
127.0.0.1:6379> zadd zset1 1 one
(integer) 1
127.0.0.1:6379> zadd zset1 2 two 3 three
(integer) 2
127.0.0.1:6379> zrange zset1 0 -1
1) "one"
2) "two"
3) "three"
zadd key number value
zrange key start end
排序输出
127.0.0.1:6379> ZRANGEBYscore zset1 -inf +inf
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> zrevrange zset1 0 -1
1) "three"
2) "two"
3) "one"
zrangebyscore key -inf +inf (升序)
zrevrange key -inf +inf(降序)
移除元素、查看数量
127.0.0.1:6379> zrem zset1 three
(integer) 1
127.0.0.1:6379> zcard zset1
(integer) 2
zrem key value
zcard key
查看指定区间的元素数量
127.0.0.1:6379> zcount zset1 2 4
(integer) 3
zcount key min max
Redis三大特殊类型
geospatial
添加地点的经纬度
geoadd china:city 116.40 39.90 beijing
获取城市的经纬度
127.0.0.1:6379> geopos china:city beijing
1) 1) "166.40000134706497192"
2) "39.90000009167092543"
geopos key city,也可以后面写多个城市,都能查询到
获取两城市之间的距离
127.0.0.1:6379> geodist china:city beijing shanghai
"4132638.7228"
geodist key city1 city2
获取两城市之间的直线距离
127.0.0.1:6379> geodist china:city shanghai beijing km
"4132.6387"
geodist key city1 city2 km
查找当前位置半径范围内的元素
127.0.0.1:6379> georadius china:city 110 30 1000 km
1) "hangzhou"
georadius key 经度 纬度 距离 单位(km)
hyperloglog
计数统计,去重复元素
127.0.0.1:6379> pfadd key1 a b c d e f g h
(integer) 1
127.0.0.1:6379> pfcount key1
(integer) 8
127.0.0.1:6379> pfadd key2 1 2 3 4 5 6
(integer) 1
127.0.0.1:6379> pfcount key2
(integer) 6
127.0.0.1:6379> pfmerge key3 key1 key2
OK
127.0.0.1:6379> pfcount key3
(integer) 14
bitmaps
存状态值
127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 1
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 0
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(integer) 0
127.0.0.1:6379> setbit sign 6 1
setbit key offset value
取值
127.0.0.1:6379> getbit sign 3
(integer) 0
getbit key offfset
统计为1数量
127.0.0.1:6379> bitcount sign 0 6
(integer) 5
bitcount key start end