一、Nosql概述
NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,特别是大数据应用难题。
二、Redis
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
三、Redis安装
1、上传安装包到opt目录下 ![](https://i-blog.csdnimg.cn/blog_migrate/c58e9d3b7eabb3fa1118959e6c7d886d.png)
2、解压安装包
使用 tar -zxvf redis-6.2.5.tar.gz 进行解压 默认解压到当前目录下。
3、进入解压后的文件
使用 ls redis-6.2.5 进入解压后的文件,可以看到redis的配置文件 redis.conf。
4、环境安装
进入redis中进行基本的环境安装 使用 yum install gcc-c++ 进行环境安装 之后使用make 进行配置,
make完毕
之后再 make install
完毕
在 /usr/local/bin可查看。
5、复制配置文件(保证安全性)
在/usr/local/bin目录下创建一个redisconfig文件夹 mkdir redisconfig
将redis里的配置文件进行复制,复制到redisconfig中 cp /opt/redis-6.2.5/redis.conf redisconfig/
6、启动Redis
redis默认不是后台启动,要修改配置文件
进入刚刚复制的redis.conf,修改配置文件 vim redis.conf
改为yes即可
返回/usr/local/bin,运行 redis-server redisconfig/redis.conf 即可启动redis
运行redis-cli -p 6379, 输入 ping, 若显示pong,则表示连接成功
连接启动成功!
7、退出Redis
在连接时使用shutdown进行保存退出,之后输入exit进行退出
查看进程
表示退出成功!
四、基础知识
redis默认有16个数据库,默认为第0个数据库,使用select 3 表示切换为第四个数据库
DBSIZE 查看DB大小
keys * 查看当前数据库中所有的key
flushdb 清除当前数据库
flushall 清除全部数据库
Redis为单线程
五、Redis-key
keys * : 查看当前数据库中所有的key
set/get : 设置key的值/取得key的值
Exists name : 判断name是否存在
move name 1:移除当前name从1号数据库中
Expire name 10: 设置name的过期时间为10s
ttl name : 查看name的剩余时间
type name :查看name的类型
六、String
Append name hello:给name追加hello(若不存在key,则相当于set key)
STRLEN name:获得name的长度
incr views:给views加1
decr views:给views减1
incrby views 10:给views加10
decrby views 10:给views减10
getrange key1 0 3:截取下标从0开始,到下标3的key1的值
getrange key1 0 -1:截取key1全部的值
setrange key1 1 66:将key1从下标为1的值开始2位,替换为66
setex key3 30 "hello":将key3值设为hello,30s后过期
setnx key4 "666":若key4值已存在,则设置失败,若不存在,则设置成功
mset k1 v1 k2 v2 k3 v3 :一次性设置多个k-v
mget k1 k2 k3:一次性获得多个值
msetnx k1 v1 k4 v4 : k1存在,但k4不存在,那么设置失败,说明是一个原子性的操作
mset user:1:name zhangsan user:1:age 20: 设置用户1的名字与年龄(设置对象时使用)
getset db redis : 如果db不存在则返回nil,并赋值;若存在,则取旧值,赋新值
七、List(列表)
所有的命令都是以L开头的
Lpush list one : 在List中放入one(从左侧插入)
Lrange list 0 -1 : 获取list中所有的值(从左往右读)
Rpush list one:在List中放入one(从右侧插入)
Lpop list : 移除左侧第一个值
Rpop list : 移除右侧第一个值
Lindex list 0: 获取list下标为0的值
Llen list:获得list的长度
lrem list 2 one :移除2个 list中的one
ltrim list 1 2 :截取list从下标为1开始到下标为2结束的value
rpoplpush mylist myotherlist: 移除mylist右侧第一个值到myotherlist中
lset list 0 item :更新list中下标为0的元素为item(若list不存在则报错,若下标不存在也报错)
Linsert list before world heihei:在list中,在world之前插入heihei
八、Set(集合)
所有的命令都是以S开头的
sadd myset hello:往myset中添加hello
smembers myset:查看myset中的元素
sismember myset hello:判断在myset中是否存在hello
scard myset:获取myset中元素的数量
srem myset hello:移除myset中的hello
srandmember myset:随机选择myset里的元素
spop myset:随机移除myset里的元素
smove myset myset2 hello: 将myset中的hello移动到myset2中
sdiff myset myset2 :查看myset中存在myset2中不存在的元素
sinter myset myset2 :查看myset与myset2中都存在的元素
sunion myset myset2 :查看myset与myset2中一起合并的元素
九、Hash(Map集合)
所有的命令都是以H开头的
hset myhash field1 xiaoming:往myhash中放一个k-v(适合存储对象)
hget myhash field1 : 取出myhash中field1的值
hmset myhash field1 hello field2 world:存放多个值
hmget myhash field1 field2:取多个值
hgetall myhash : 取全部的值
hdel myhash field1:删除myhash中field1
hlen myhash:获取myhash的个数
hexists myhash field1 :判断myhash中是否存在field1
hkeys myhash : 获取myhash中全部的key
hvals myhash : 获取myhash中全部的value
hincrby myhash field3 1: 将myhash中field3中的值加1
hdecrby myhash field3 1: 将myhash中field3中的值减1
hsetnx myhash field4 hello:若果myhash中field4的值不存在,则可以设置,否则不可以设置
十、Zset
所有的命令都是以Z开头的
zadd myzset 1 one :在myzset第一位添加one(可一次性添加多个值)
zrange myzset 0 -1:查看myzset中全部元素
zrangebyscore salary -inf +inf:在salary中,从小到大排序
zrangebyscore salary -inf 2500 withscores:在salary中,显示小于2500的并且附带成绩
zrevrange salary +inf -inf:在salary中,从大到小排序
zrem salary xiaoming:移除salary中的xiaoming元素
zcard salary:查看salary中元素的个数
zcount myset 1 2 :查看myset集合中的1到2之间有几个元素
十一、三种特殊数据类型
geospatial:
geoadd china:city 经度,纬度 beijing:将 beijing的经纬度添加
geopos china:city beijing :获取beijing的经纬度
geodist china:city beijing shanghai :获取beijing到shanghai的距离(可以加单位)
georadius china:city 110,30 1000 km:获得以110经度,30纬度为圆心,半径为1000km的城市(可以加参数:距离,纬度,数量)
georadiusbymember china:city beijing 1000km :查看距离北京1000km的城市
Hyperloglog
pfadd mykey a b c d e f g h i j:添加mykey到Hyperloglog中,并且mykey中有10个元素
pfcount mykey:查看mykey中不重复元素的个数
pfmerge mykey3 mykey2 mykey1:把mykey1与mykey2合并到一起,起名为mykey3(重复的会取一个)
Bitmaps(0/1)
setbit sign 0 1:设置 sign的第0个元素为1
getbit sign 0:获得sign的第0个元素
bitcount sign:获得sign值为1的有多少
十二、事务
redis事务特性:一次性,顺序性,排他性,不保证原子性。
所有的命令在事务中,并不是直接被执行,而是发起了执行命令才会被执行(Exec)
执行事务
开启事务:multi
执行:exec
放弃事务:discard
执行事务出错
1、编译型异常(代码问题),事务中所有的命令都不会被执行
2、运行时异常(1/0),其他命令可以正常执行,错误命令抛出异常
锁的问题
乐观锁 watch:money:监控money,当一个线程操作时,可以正确提交事务,当有另外一个线程在当前线程中操作money时,提交事务失败
十三、Jedis
1、导入Jedis包
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
2、连接测试
在测试连接之前,要注意以下几点:
1、ip与端口号要正确。
2、关闭Linux防火墙
3、把redis的配饰文件的bind那一行注释掉
4、把redis的配饰文件的protected-mode 改为 no
public class TestPing {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.253.134",6379);
System.out.println(jedis.ping());
}
}
若显示PONG,则表示连接成功!
十四、Redis.conf
bind 127.0.0.1 :绑定ip
protected-mode yes:受保护模式
port 6379:端口号
daemonize yes :以守护进程的方式运行,默认为no
loglevel notice: 日志
logfile "" : 日志的文件位置名
database 16:数据库数量
always-show-logo yes :是否显示logo
save 900 1:900秒内,至少有一个key进行了修改,就进行持久化操作
rdbcompression yes :是否压缩rdb文件
rdbchecksum yes:保存rdb文件时,进行错误的检查校验
requirepass:设置密码 默认没有密码
config set requirepass '123456' :设置密码
auth 123456 :验证密码
maxclients 10000:设置能连接上redis的最大客户端的数量
maxmemory <bytes> : redis配置最大内存容量
maxmemory-policy noeviction # 内存达到上限之后的处理策略
1、volatile-lru:只对设置了过期时间的key进行LRU(默认值)
2、allkeys-lru : 删除lru算法的key
3、volatile-random:随机删除即将过期key
4、allkeys-random:随机删除
5、volatile-ttl : 删除即将过期的
6、noeviction : 永不过期,返回错误
十五、发布订阅
SUBSCRIBE xss:订阅xss
PUBLISH xss nizhenshuai:在xss频道发送nizhenshuai
UNSUBSCRIBE xss:取消订阅订阅xss