Redis是一个高性能的key-value 数据库,同时支持list,set,zset,hash等数据结构的存储
(先用windows 版本看下入个门,一般linux用的多,学习来源菜鸟教程)
下载安装到一个你能找到的地方
推荐在某个盘下建一个tool的文件夹,把go啦java啦mysql啦Redis啦,这种工具性的工具放进去
https://github.com/tporadowski/redis/releases
下载zip版本
(前提,每个命令提示符都要先进入redis那个文件下,要不找不到,切换路径的命令:cd /d 路径)
再开一个命令提示符,开客服端:redis-cli.exe -h 127.0.0.1 -p 6379
设置键值对:set heiKey ha
取键值对:get heiKey
数据类型
偷一张网络视频的图
他是一种nosql数据库,
好处就是如图
作为缓存使用,减小io压力
NoSQL非关系型数据库
分类 | Examples举例 | 典型应用场景 | 数据模型 | 优点 | 缺点 |
---|---|---|---|---|---|
键值(key-value) | Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB | 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。 | Key 指向 Value 的键值对,通常用hash table来实现 | 查找速度快 | 数据无结构化,通常只被当作字符串或者二进制数据 |
列存储数据库 | Cassandra, HBase, Riak | 分布式的文件系统 | 以列簇式存储,将同一列数据存在一起 | 查找速度快,可扩展性强,更容易进行分布式扩展 | 功能相对局限 |
文档型数据库 | CouchDB, MongoDb | Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容) | Key-Value对应的键值对,Value为结构化数据 | 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 | 查询性能不高,而且缺乏统一的查询语法。 |
图形(Graph)数据库 | Neo4J, InfoGrid, Infinite Graph | 社交网络,推荐系统等。专注于构建关系图谱 | 图结构 | 利用图结构相关算法。比如最短路径寻址,N度关系查找等 | 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。 |
xftp连接云服务器的实例主机密码就是root账户密码:W…….
下载安装redis
稳定版本安装地址 : https://redis.io/download/#redis-downloads
在linux中安装redis需要有c语言编译环境,centos7,有gcc就行,通过命令检测是否有gcc,
gcc --version
检查是否有gcc环境,有的话就tar -zxvf 压缩包名字
make
把redis编译成c文件make install
安装我在这里遇到过一个问题,原因是下错了版本,下载成了stack版本,当时没注意…
推荐后台启动redis,所以需要,进入到redis目录下,cp redis.conf /etc/redis.conf
复制到的目录可以任意(自己知道就行)
把后台启动改成允许,daemonize no 改成yes,在etc目录下vi redis.conf
/daem
搜索一下daemonize no在哪里,vi(vim)命令可别忘了,然后i
进入编辑模式,把no改成yes,:wq
保存退出
在/usr/local/bin
目录下后台启动/etc
里边的redis.conf,命令:redis-server /etc/redis.conf
redis-cli
连接上redis
欸嘿!第一个例子
[root@jingZhi bin]# redis-cli
127.0.0.1:6379> set heiKey ha
OK
127.0.0.1:6379> get heiKey
"ha"
127.0.0.1:6379> ping
PONG
关闭redis的后台命令:shutdown
然后exit
,
说一下我遇到的问题,第二次,先是关不掉,因为我查看进程发现redis还在后天运行,但是哈,之后直接把我服务器给关了,
shutdown是直接把电源关了,就是退出和linux系统的连接了,需要在阿里云管理平台开启服务器
总之就是关闭后台redis这个我暂时没解决,就是关不掉后台
所以就exit
退出这个端口号就行了,让他一直在后端运行吧
查看进程ps -ef | grep redis
redis来源:Merz
使用
set key value
设置key-value
取出值get key
key键常用命令
keys *
查看当前库所有key,匹配keys*1
exists key
判断某个key是否存在type key
查看key(的值)类型del key
删除指定keyunlink key
根据value选择非阻塞删除expire key 20
设置指定key20秒后过期ttl key
查看key还有多少秒过期,-1永远不过期,-2已经过期select 3
选择数据库3,默认是0,redis有16个库dbsize
查看有多少个keyflushdb
删除当前库所有keyflushall
删除所有库所有key,不常用127.0.0.1:6379> set HeiKey ha
OK
127.0.0.1:6379> set qieKey xi
OK
127.0.0.1:6379> keys *
1) "qieKey"
2) "HeiKey"
127.0.0.1:6379> exists k1
(integer) 0
127.0.0.1:6379> exists qieKey
(integer) 1
127.0.0.1:6379> type HeiKey
string
127.0.0.1:6379> del qieKey
(integer) 1
127.0.0.1:6379> keys *
1) "HeiKey"
127.0.0.1:6379> set naKey ni
OK
127.0.0.1:6379> expire HeiKey 20
(integer) 1
127.0.0.1:6379> ttl HeiKey
(integer) 9
127.0.0.1:6379> ttl HeiKey
(integer) -2 #-2表示已经过期
127.0.0.1:6379> ttl naKey
(integer) -1 #-1表示永远不过期
127.0.0.1:6379> select 3
OK
127.0.0.1:6379[3]> select 0
OK
127.0.0.1:6379> dbsize
(integer) 1
127.0.0.1:6379> keys *
1) "naKey"
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)
说明
常用命令
set keyname value
设置get keyname
取值append keyname value
追加内容strlen keyname
查看key值长度setnx keyname value
当key不存在时,设置key值incr keyname
对数字值操作+1decr keyname
对数字值操作-1incrby keyname n
对数字值操作+ndecrby keyname n
对数字值操作-nmset k1 v1 k2 v2
设置多个值mget k1 k2
取出多个值msetnx
懂得都懂,有一点说明,一旦有一个存在则设置都失败getrange keyname 0 3
范围取值,0代表第一个,以此……setrange keyname 3 覆盖的内容
3代表第四个开始覆盖setex keyname n valuename
设置一个值,过期时间是n,值是valuenamettl keyname
查看keyname过期时间getset keyname valuename
设置valuename新值同时查看旧值127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 v100
OK
127.0.0.1:6379> set k2 v200
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> get k1
"v100"
127.0.0.1:6379> set k1 v1100
OK
127.0.0.1:6379> get k1
"v1100"
127.0.0.1:6379> append k1 abc
(integer) 8
127.0.0.1:6379> get k1
"v1100abc"
127.0.0.1:6379> strlen k1
(integer) 8
127.0.0.1:6379> setnx k1 asdf
(integer) 0
127.0.0.1:6379> setnx k3 v300
(integer) 1
127.0.0.1:6379> set k4 100
OK
127.0.0.1:6379> incr k4
(integer) 101
127.0.0.1:6379> get k4
"101"
127.0.0.1:6379> decr k4
(integer) 100
127.0.0.1:6379> incrby k4 7
(integer) 107
127.0.0.1:6379> decrby k4 8
(integer) 99
127.0.0.1:6379> get k4
"99"
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> mget k1 k2
1) "v1"
2) "v2"
127.0.0.1:6379> msetnx k11 v11 k1 v11
(integer) 0
127.0.0.1:6379> mset k11 v11 k22 v22
OK
127.0.0.1:6379> set name wangdahai
OK
127.0.0.1:6379> get name
"wangdahai"
127.0.0.1:6379> getrange name 0 3
"wang"
127.0.0.1:6379> setrange name 3 heiha
(integer) 9
127.0.0.1:6379> get name
"wanheihai"
127.0.0.1:6379> setex age 20 value30
OK
127.0.0.1:6379> ttl age
(integer) 17
127.0.0.1:6379> get age
"value30"
127.0.0.1:6379> getset name lalalal
"wanheihai"
127.0.0.1:6379> get name
"lalalal"
127.0.0.1:6379>
说明
常用命令
lpush/rpush k1 v1 v2 v3
设置一key多valuelrange keyname 0 -1
从左往右取值,0到-1 可以取到所有的值lpop/rpop keyname
从左/右出来一个值,并且删除这个值。rpoplpush k1 k2
k1右边吐出1个值放到k2左边,把k1的最右边的放在k2的第一个了,其他的往后推1,lindex k1 1
获取下标为2的元素llen keyname
获取keyname长度linsert keyname before/after value newvalue
在keyname的value前/后插入newvaluelrem keyname n value
删除n个从keyname的value左到右,lset keyname n newvalue
用newvalue覆盖keyname的下标为n的元素127.0.0.1:6379> keys *
(empty array)
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> lpop k1
"v2"
127.0.0.1:6379> lrange k1 0 -1
1) "v1"
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)
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"
kkk
127.0.0.1:6379> lrange k1 0 -1
1) "v3"
2) "v2"
127.0.0.1:6379> lindex k1 1
"v2"
127.0.0.1:6379> llen k1
(integer) 2
127.0.0.1:6379> linsert k1 before v3 newv3
(integer) 3
127.0.0.1:6379> lrange k1 0 -1
1) "newv3"
2) "v3"
3) "v2"
127.0.0.1:6379> linsert k1 after v3 newv4
(integer) 4
127.0.0.1:6379> lrange k1 0 -1
1) "newv3"
2) "v3"
3) "newv4"
4) "v2"
127.0.0.1:6379> lrem k1 1 v3
(integer) 1
127.0.0.1:6379> lrange k1 0 -1
1) "newv3"
2) "newv4"
3) "v2"
127.0.0.1:6379> lset k1 1 newv33
OK
127.0.0.1:6379> lrange k1 0 -1
1) "newv3"
2) "newv33"
3) "v2"
list数据结构
说明:
底层数据结构
常用命令:
sadd key value1 value2....
添加值smembers key
取出该集合所有值sismember key value
判断key集合是否含有valuescard key
返回key的元素个数srem k1 v1 v3
删除k1集合的v1 v3元素spop k1
随机吐出k1集合一个元素,吐出同时删除了srandmember k1 n
随机取出n个值,不会从集合删除smove sourcekey destinationkey value
把sourcekey中value移到destinationkeysinter k1 k2
返回交集sunion k1 k2
返回并集sdiff k1 k2
返回差集。包含k1不包含k2的127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd k1 v1 v2 v3
(integer) 3
127.0.0.1:6379> smembers k1
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> sismember k1 v2
(integer) 1
127.0.0.1:6379> sismember k1 v4
(integer) 0
127.0.0.1:6379> srem k1 v1 v3
(integer) 2
127.0.0.1:6379> smembers k1
1) "v2"
127.0.0.1:6379> sadd k1 v3 v4
(integer) 2
127.0.0.1:6379> smembers k1
1) "v4"
2) "v3"
3) "v2"
127.0.0.1:6379> spop k1
"v4"
127.0.0.1:6379> spop k1
"v3"
127.0.0.1:6379> sadd k1 v1 v2 v3 v4 v5 v3
(integer) 4
127.0.0.1:6379> smembers k1
1) "v3"
2) "v1"
3) "v2"
4) "v4"
5) "v5"
127.0.0.1:6379> spop k1
"v1"
127.0.0.1:6379> srandmember k1 2
1) "v3"
2) "v2"
127.0.0.1:6379> scard k1
(integer) 4
127.0.0.1:6379> smembers k1
1) "v4"
2) "v2"
3) "v3"
4) "v5"
127.0.0.1:6379> spop k1
"v5"
127.0.0.1:6379> smembers k1
1) "v4"
2) "v2"
3) "v3"
127.0.0.1:6379> smembers k1
1) "v4"
2) "v2"
3) "v3"
127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> sadd k2 v21 v23 v24 v25
(integer) 4
127.0.0.1:6379> smove k1 k2 v2
(integer) 1
127.0.0.1:6379> smembers k2
1) "v25"
2) "v21"
3) "v24"
4) "v23"
5) "v2"
127.0.0.1:6379> smembers k1
1) "v4"
2) "v3"
127.0.0.1:6379> sadd k1 v2 v23
(integer) 2
127.0.0.1:6379> sinter k1 k2
1) "v2"
2) "v23"
127.0.0.1:6379> smembers k1
1) "v4"
2) "v2"
3) "v3"
4) "v23"
127.0.0.1:6379> smembers k2
1) "v21"
2) "v25"
3) "v2"
4) "v23"
5) "v24"
127.0.0.1:6379> sunion k1 k2
1) "v25"
2) "v21"
3) "v4"
4) "v2"
5) "v3"
6) "v24"
7) "v23"
127.0.0.1:6379> disff k1 k2
(error) ERR unknown command `disff`, with args beginning with: `k1`, `k2`,
127.0.0.1:6379> sdiff k1 k2
1) "v4"
2) "v3"
说明
数据结构
常用命令
hset key field value
key集合field键赋值value,例子hset user:1001 name jingzhi
hget key field
从key集合filed取出value
hmset key field1 value1 field2 value2...
批量设置hash值
hexists key field
产看hash表key中,给定field是否存在
hkeys key
查看key的所有field
hvals key
查看key所有的value
hincrby key field n
key哈希表中field域值增n,n可以是负数
hsetnx key field value
当且仅当field不存在时候给field值设置为value
127.0.0.1:6379> hset user:1000 id 1
(integer) 1
127.0.0.1:6379> hset user:1000 name jingzhi
(integer) 1
127.0.0.1:6379> hget user:1000 name
"jingzhi"
127.0.0.1:6379> hmset user:1002 id 2 name lisi age 21
OK
127.0.0.1:6379> hexists user:1000
(error) ERR wrong number of arguments for 'hexists' command
127.0.0.1:6379> hexists user:1000
(error) ERR wrong number of arguments for 'hexists' command
127.0.0.1:6379> hexists user:1000 name
(integer) 1
127.0.0.1:6379> hkeys user:1002
1) "id"
2) "name"
3) "age"
127.0.0.1:6379> hvals user:1002
1) "2"
2) "lisi"
3) "21"
127.0.0.1:6379> hincrby user:1002 age 7
(integer) 28
127.0.0.1:6379> hsetnx user:1002 age 30
(integer) 0
127.0.0.1:6379> hsetnx user:1002 gender 2
(integer) 1
127.0.0.1:6379> hkeys user:1002
1) "id"
2) "name"
3) "age"
4) "gender"
说明
数据结构
常用命令
zadd key score1 value1 score2 value2...
将一个或者多个value元素以及score添加集合到keyrange rank 0 -1 withscores
查看所有元素及其分数,0和-1代表下标,0到-1是所有zrangebyscore key n m[withscores]
从小到大显示,区间是n——mzrevrangebyscore key m n[withscores]
从大到小显示,区间是m——nzincrby key n value
给元素value添加n分zrem key value
删除key集合value元素zcount key n m
统计n 到 m区间的元素个数zrank key value
查询该value元素在key集合的排名,排名从0开始127.0.0.1:6379> zadd rank 99 bainiangudu 98 shuimiangeming 96 wenhuakulv 97 wangyuancheng
(integer) 4
127.0.0.1:6379> zrange rank 0 -1
1) "wenhuakulv"
2) "wangyuancheng"
3) "shuimiangeming"
4) "bainiangudu"
127.0.0.1:6379> zrange rank 0 -1 withscores
1) "wenhuakulv"
2) "96"
3) "wangyuancheng"
4) "97"
5) "shuimiangeming"
6) "98"
7) "bainiangudu"
8) "99"
1
127.0.0.1:6379> zrangebyscore rank 97 99
1) "wangyuancheng"
2) "shuimiangeming"
3) "bainiangudu"
127.0.0.1:6379> zrevrangebyscore rank 98 96
1) "shuimiangeming"
2) "wangyuancheng"
3) "wenhuakulv"
127.0.0.1:6379> zincrby rank 9 shuimiangeming
"107"
127.0.0.1:6379> zrem rank wangyuancheng
(integer) 1
127.0.0.1:6379> zcount rank 1 110
(integer) 3
127.0.0.1:6379> zrank rank bainiangudu
(integer) 1
127.0.0.1:6379> zrange rank 0 -1 withscores
1) "wenhuakulv"
2) "96"
3) "bainiangudu"
4) "99"
5) "shuimiangeming"
6) "107"
配置文件(听了一边,没啥好说的)
SUBSCRIBE channel1
publish channel1 hello
127.0.0.1:6379> SUBSCRIBE channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "message"
2) "channel1"
3) "hei"
#另一个会话
127.0.0.1:6379> publish channel1 hei
(integer) 1
127.0.0.1:6379>
setbit key 对象 偏移量
getbit key 对象
setbit unique:key 对象 偏移量
bitop and unique:users:and:20201104_03 unique:users:20201103 unique:users:20201104
127.0.0.1:6379> setbit user:20210101 1 1
(integer) 0
127.0.0.1:6379> setbit user:20210101 6 1
(integer) 0
127.0.0.1:6379> setbit user:20210101 11 1
(integer) 0
127.0.0.1:6379> setbit user:20210101 16 1
(integer) 0
127.0.0.1:6379> setbit user:20210101 19 1
(integer) 0
127.0.0.1:6379> getbit users:20210101 6
(integer) 0
127.0.0.1:6379> getbit users:20210101 1
(integer) 0
127.0.0.1:6379> getbit user:20210101 1
(integer) 1
127.0.0.1:6379> setbit unique:users:20201104 1 1
(integer) 0
127.0.0.1:6379> setbit unique:users:20201104 2 1
(integer) 0
127.0.0.1:6379> setbit unique:users:20201104 5 1
(integer) 0
127.0.0.1:6379> setbit unique:users:20201104 9 1
(integer) 0
127.0.0.1:6379> setbit unique:users:20201103 0 1
(integer) 0
127.0.0.1:6379> setbit unique:users:20201103 1 1
(integer) 0
127.0.0.1:6379> setbit unique:users:20201103 4 1
(integer) 0
127.0.0.1:6379> setbit unique: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) 2
pfadd key 内容
添加pfcount key
产看基数pfmerge newkey k1 k2
把k1,k2合并到newkey127.0.0.1:6379> pfadd program "java"
(integer) 1
127.0.0.1:6379> pfadd program "c++"
(integer) 1
127.0.0.1:6379> pfadd program "php"
(integer) 1
127.0.0.1:6379> pfadd program "c++"
(integer) 0
127.0.0.1:6379> pfcount program
(integer) 3
(i
127.0.0.1:6379> pfadd k1 "a"
(integer) 1
127.0.0.1:6379> pfmerge k100 k1 program
OK
127.0.0.1:6379> pfcount k100
(integer) 4
geoadd key 经度 纬度 城市 经度 纬度 城市...
添加geopos key 城市
获取经纬度geodist key city1 city2 km
获取city1到city2的kmgeoradius key 经度 纬度 radius km
获取经纬度radius km范围有几个city127.0.0.1:6379> geoadd china:city 1.23 2.23 shanghai 2.34 3.34 chengdu 1.23456 2.234 beijing
(integer) 3
127.0.0.1:6379> geopos china:city beijing
1) 1) "1.23455911874771118"
2) "2.23400057363439686"
127.0.0.1:6379> geodist china:city beijing shanghai km
"0.6743"
127.0.0.1:6379> georadius china:city 110 30 100 km
(empty array)
127.0.0.1:6379> georadius china:city 110 30 1000 km
(empty array)
127.0.0.1:6379> georadius china:city 10 2 10000 km
1) "shanghai"
2) "beijing"
3) "chengdu"
18——20,因为是走go,所以,jedis,用java操作redis我就跳过了
multi
开启事务事务...
exec
执行事务discard
打断事务127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> get k2
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) OK
3) "v2"
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set a1 v1
QUEUED
127.0.0.1:6379(TX)> discard
OK
#失败情况
#组队阶段错误
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> get k2
QUEUED
127.0.0.1:6379(TX)> set k3
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discarded because of previous errors.
#exec阶段错误
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> incr k2
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) (error) ERR value is not an integer or out of range
127.0.0.1:6379>
watch key
#会话一
127.0.0.1:6379> set balance 100
OK
127.0.0.1:6379> watch balance
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> incrby balance 19
QUEUED
127.0.0.1:6379(TX)> exec
1) (integer) 119
#会话二
127.0.0.1:6379> keys *
1) "k2"
2) "balance"
127.0.0.1:6379> watch balance
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> incrby balance 17
QUEUED
127.0.0.1:6379(TX)> exec
(nil)