redis的详细说明

yum install -y gcc
gcc --version
tar -zxvf redis-6.2.7.tar.gz -C /opt
dbsize
flushdb
flushall
select 15

ps -ef | grep redis
whereis redis
whereis redis-server

kill -9
ps -auf | grep redis

keys *
set k1 v1
exists k1
del k1   (直接删除)
unlink k1    (异步删除)

expire k1 1 (给key设置过期时间)
ttl key     (查看key还有多少秒过期,-1表示永不过期,-2表示已过期)

get key:获取value值
append:将给定的value追加到原值的末尾
strlen:获得值的长度
setnx:只有在key不存在时,设置key的值

incr key :key加1
decr key:key减1
incrby key 10:key 加10
decrby key 10:key减10

mset:能设置多个key
mget:取多个key

msetnx:只要有一个失败,全部失败,满足原子性

set name lucymarry
get range name 0 3

127.0.0.1:6379> set name lucymarry
OK
127.0.0.1:6379> getrange name 0 3
"lucy"
127.0.0.1:6379> setrange name 3 abc
(integer) 9
127.0.0.1:6379> get name
"lucabcrry"

127.0.0.1:6379> setex age 20 value30
OK
127.0.0.1:6379> ttl age
(integer) 13

127.0.0.1:6379> getset name java
"lucabcrry"
127.0.0.1:6379> get name
"java"

String的数据结构为简单动态字符串,SDS,当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,
扩容时一次只会多扩1M空间。需要注意的是字符串最大长度为512M.

list的数据结构为快速链表quickList,首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是
压缩列表。它将所有的元素紧挨着一起存储,分配的是一块连续的内存。当数据量比较多的时候才会改写成quicklist。

因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个
额外的指针prev和next。

redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针穿起来使用。这样既满足了快速的插入删除
性能,又不会出现太大的空间冗余。

是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差,
按照插入顺序排序,简单的字符串列表

127.0.0.1:6379> clear
127.0.0.1:6379> lpush k1 v1 v2 v3
(integer) 3
127.0.0.1:6379> lrange k1 0 -1
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> rpush k2 v1 v2 v3
(integer) 3
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> lpop k1
"v3"
127.0.0.1:6379> rpop k2
"v3"
127.0.0.1:6379> rpop k2
"v2"
127.0.0.1:6379> rpop k2
"v1"
127.0.0.1:6379> rpop k2
(nil)
值在键在,值光键亡

127.0.0.1:6379> lpush k1 v1 v2 v3
(integer) 3
127.0.0.1:6379> rpush k2 v11 v12 v13
(integer) 3
127.0.0.1:6379> rpoplpush k1 k2
"v1"
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "v11"
3) "v12"
4) "v13"
127.0.0.1:6379> lindex k2 2
"v12"
127.0.0.1:6379> llen k2
4

127.0.0.1:6379> linsert k2 before 'v11' 'newv11'
(integer) 5
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "newv11"
3) "v11"
4) "v12"
5) "v13"
127.0.0.1:6379> linsert k2 before 'v12' 'newv11'
(integer) 6
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "newv11"
3) "v11"
4) "newv11"
5) "v12"
6) "v13"
127.0.0.1:6379> linsert k2 before 'v13' 'newv11'
(integer) 7
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "newv11"
3) "v11"
4) "newv11"
5) "v12"
6) "newv11"
7) "v13"

127.0.0.1:6379> lrem k2 2 'newv11'
(integer) 2
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "v11"
3) "v12"
4) "newv11"
5) "v13"
127.0.0.1:6379> lset k2 1 atguigu
OK
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "atguigu"
3) "v12"
4) "newv11"
5) "v13"

set的数据结构是dict字典,字典是用哈希表实现的。Java中HashSet的内部使用的是HashMap,
只不过所有的value都指向同一个对象。Redis的set结构也是一样,它的内部也使用hash结构,
所有的value都指向同一个内部值


127.0.0.1:6379> sadd k1 v1 v2 v3
(integer) 3
127.0.0.1:6379> smembers k1
1) "v2"
2) "v3"
3) "v1"
127.0.0.1:6379> sismember k1 v1
(integer) 1
127.0.0.1:6379> sismember k1 v11
(integer) 0
127.0.0.1:6379> scard k1
(integer) 3
127.0.0.1:6379> srem k1 v1 v2
(integer) 2
127.0.0.1:6379> scard
(error) ERR wrong number of arguments for 'scard' command
127.0.0.1:6379> scard k1
(integer) 1
127.0.0.1:6379> smembers k1
1) "v3"
127.0.0.1:6379> sadd k2 v1 v2 v3 v4
(integer) 4
127.0.0.1:6379> spop k2
"v4"
127.0.0.1:6379> spop k2
"v2"
127.0.0.1:6379> srandmember k2 2
1) "v3"
2) "v1"
127.0.0.1:6379> srandmember k2 2
1) "v3"
2) "v1"

127.0.0.1:6379> sadd k1 v1 v2 v3
(integer) 3
127.0.0.1:6379> sadd k2 v3 v4 v5
(integer) 3
127.0.0.1:6379> smove k1 k2 v3
(integer) 1
127.0.0.1:6379> smembers k2
1) "v4"
2) "v3"
3) "v5"
127.0.0.1:6379> smembers k1
1) "v2"
2) "v1"
127.0.0.1:6379> sinter k1 k2
(empty array)
127.0.0.1:6379> sadd k3 v4 v6 v7
(integer) 3
127.0.0.1:6379> sinter k2 k3
1) "v4"
127.0.0.1:6379> sunion k1 k2
1) "v4"
2) "v2"
3) "v3"
4) "v1"
5) "v5"
127.0.0.1:6379> sdiff k2 k3
1) "v3"
2) "v5"


hash类型对应的数据结构是两种,ziplist(压缩列表),hashtable(哈希表).当field-value长度较短且个数较少时,
使用ziplist,否则使用hashtable。

127.0.0.1:6379> hset user:10001 id 1
(integer) 1
127.0.0.1:6379> hset user:10001 name zhangsan
(integer) 1
127.0.0.1:6379> hget user:10001 id
"1"
127.0.0.1:6379> hget user:10001 name
"zhangsan"
127.0.0.1:6379> hmset user:10002 id 2 name lisi age 30
OK
127.0.0.1:6379> hexists user:10002 id
(integer) 1
127.0.0.1:6379> hexists user:10002 name
(integer) 1
127.0.0.1:6379> hkeys *
(empty array)
127.0.0.1:6379> hkeys user:10002
1) "id"
2) "name"
3) "age"
127.0.0.1:6379> hvalues user:10002
(error) ERR unknown command `hvalues`, with args beginning with: `user:10002`, 
127.0.0.1:6379> hvals user:10002
1) "2"
2) "lisi"
3) "30"
127.0.0.1:6379> hincrby user:10002 age 2
(integer) 32
127.0.0.1:6379> hsetnx user:10002 age 40
(integer) 0
127.0.0.1:6379> hsetnx user:10002 gender 1
(integer) 1
127.0.0.1:6379> hkeys user:10002
1) "id"
2) "name"
3) "age"
4) "gender"
127.0.0.1:6379> hvals user:10002
1) "2"
2) "lisi"
3) "32"
4) "1"

zset底层使用了两个数据结构
(1)hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score
(2)跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。

redis有序集合zset,有序集合的每个成员都关联了一个评分,这个评分被用来按照从最低分到最高分的方式排序
集合中的成员。集合的成员是唯一的,但是评分可以重复了。因为元素是有序的,所以你也可很快的而根据评分或者
次序来获取一个范围的元素

访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。


127.0.0.1:6379> zadd topn 200 java 300 c++ 400 mysql 500 php
(integer) 4
127.0.0.1:6379> zrange topn 0 -1
1) "java"
2) "c++"
3) "mysql"
4) "php"
127.0.0.1:6379> zrange topn 0 -1 withscores
1) "java"
2) "200"
3) "c++"
4) "300"
5) "mysql"
6) "400"
7) "php"
8) "500"
127.0.0.1:6379> zrangebyscore topn 300 500
1) "c++"
2) "mysql"
3) "php"
127.0.0.1:6379> zrangebyscore topn 300 500 whthscores
(error) ERR syntax error
127.0.0.1:6379> zrangebyscore topn 300 500 withscores
1) "c++"
2) "300"
3) "mysql"
4) "400"
5) "php"
6) "500"
127.0.0.1:6379> zrevrangebyscore topn 500 200
1) "php"
2) "mysql"
3) "c++"
4) "java"
127.0.0.1:6379> zrevrangebyscore topn 500 200 withscores
1) "php"
2) "500"
3) "mysql"
4) "400"
5) "c++"
6) "300"
7) "java"
8) "200"
127.0.0.1:6379> zincryby topn 50 java
(error) ERR unknown command `zincryby`, with args beginning with: `topn`, `50`, `java`, 
127.0.0.1:6379> zincrby topn 50 java
"250"
127.0.0.1:6379> zrem topn php
(integer) 1
127.0.0.1:6379> zrange topn 0 -1
1) "java"
2) "c++"
3) "mysql"
127.0.0.1:6379> zcount topn 200 500
(integer) 3
127.0.0.1:6379> zrank topn java
(integer) 0
127.0.0.1:6379> zrank topn mysql
(integer) 2

pub/sub 发布和订阅是一种消息通信模式
redis客户端可以订阅任意数量的频道

127.0.0.1:6379> subscribe channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1

127.0.0.1:6379> publish channel1 hello
(integer) 1

Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "message"
2) "channel1"
3) "hello"

BitMap:本身不是一种数据类型,实际上它就是字符串,但是它可以对字符串的位进行操作。
BitMaps单独提供了一套命令,所以在redis中使用了BitMaps和使用字符串的方法不太相同。
可以把bitmap想象成一个以位为单位的数组,数据的每个单元只能存储0和1,数组的下标在bitmaps
中叫做偏移量

bitmap能够极大的节约空间,还可以求并集操作,对于求月活跃用户极其方便,但是对于活跃用户比较少的网站
使用bitmap并不合适,当活跃用户比较多时,bitmap上上之选。

127.0.0.1:6379> setbit users:20210101 1 1
(integer) 0
127.0.0.1:6379> setbit users:20210101 6 1
(integer) 0
127.0.0.1:6379> setbit users:20210101 11 1
(integer) 0
127.0.0.1:6379> setbit users:20210101 15 1
(integer) 0
127.0.0.1:6379> setbit users:20210101 19 1
(integer) 0
127.0.0.1:6379> getbit users:20210101 1
(integer) 1
127.0.0.1:6379> getbit users:20210101 6
(integer) 1
127.0.0.1:6379> getbit users:20210101 8
(integer) 0
127.0.0.1:6379> bitcount users:20210101
(integer) 5
127.0.0.1:6379> bitcount users:20210101 1 3
(integer) 3
127.0.0.1:6379> setbit unigue:users:20201104 1 1
(integer) 0
127.0.0.1:6379> setbit unigue:users:20201104 2 1
(integer) 0
127.0.0.1:6379> setbit unigue:users:20201104 5 1
(integer) 0
127.0.0.1:6379> setbit unigue:users:20201104 9 1
(integer) 0
127.0.0.1:6379> setbit unigue:users:20201103 0 1
(integer) 0
127.0.0.1:6379> setbit unigue:users:20201103 1 1
(integer) 0
127.0.0.1:6379> setbit unigue:users:20201103 4 1
(integer) 0
127.0.0.1:6379> setbit unigue:users:20201103 9 1
(integer) 0
127.0.0.1:6379> bitop and unique:users:and:20201104_03 unique:users:20201103 unique:users:20201104
(integer) 0
127.0.0.1:6379> bitcount unique:users:and:20201104_03
(integer) 0
127.0.0.1:6379> bitop and unigue:users:and:20201104_03 unigue:users:20201103 unigue:users:20201104
(integer) 2
127.0.0.1:6379> bitcount unigue:users:and:20201104_03
(integer) 2
127.0.0.1:6379> bitop or unigue:users:or:20201104_03 unigue:users:20201103 unigue:users:20201104
(integer) 2
127.0.0.1:6379> bitcount unigue:users:or:20201104_03
(integer) 6

HyperLogLog(解决基数问题的,去重,不管加多少元素,花费的内存都是12kb,跟其他的不同,元素越多,需要空间越大不同)
UV PV
27.0.0.1:6379> pfadd program "java"
(integer) 1
127.0.0.1:6379> pfadd program "php"
(integer) 1
127.0.0.1:6379> pfadd program "java"
(integer) 0
127.0.0.1:6379> pfadd program "c++" "mysql"
(integer) 1
127.0.0.1:6379> pfcount program
(integer) 4
127.0.0.1:6379> pfcount program "java"
(integer) 0
127.0.0.1:6379> pfadd program "java"
(integer) 1
127.0.0.1:6379> pfcount program
(integer) 1
127.0.0.1:6379> pfcount program
(integer) 1
127.0.0.1:6379> pfadd program "c++"
(integer) 1
127.0.0.1:6379> pfcount program
(integer) 2
127.0.0.1:6379> pfadd program "c++"
(integer) 0
127.0.0.1:6379> pfcount program
(integer) 2
127.0.0.1:6379> pfadd k1 "a"
(integer) 1
127.0.0.1:6379> pfadd k1 "b"
(integer) 1
127.0.0.1:6379> pfcount k1
(integer) 2
127.0.0.1:6379> pfmerge k100 k1 program
OK
127.0.0.1:6379> pfcount k100
(integer) 4
127.0.0.1:6379> 


GeoSpatial:对地理位置,两点之间的距离,


127.0.0.1:6379> geoadd china:city  121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen 116.38 39.90 beijing
(integer) 3
127.0.0.1:6379> geopos china:city shanghai
1) 1) "121.47000163793563843"
   2) "31.22999903975783553"
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.38000041246414185"
   2) "39.90000009167092543"
127.0.0.1:6379> geopos china:city hefei
1) (nil)
127.0.0.1:6379> geodist china:city beijing shanghai km
"1068.1535"
127.0.0.1:6379> georadius china:city 110 30 1000 km 
1) "chongqing"
2) "shenzhen"
127.0.0.1:6379> 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值