- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
按照预先设置的组织机构,将数据存储在物理介质上(即:硬盘上) 数据之间可以做无关联操作 (例如: 多表查询,嵌套查询,外键等) 。
主流的RDBMS软件:MySQL、MariaDB、Oracle、DB2、SQL Server;要存储的数据是有固定格式的(例如:要向银行存现金,需要录入:姓名,年龄,金额,家庭住址等),并且是永久存储的,类似这种对于同一个业务,录入数据的方式一样的采用关系型数据库.
意思是“不仅仅是SQL” 泛指非关系型数据库,不需要预先定义数据存储结构,每条记录可以有不同的 数据类型 和 字段个数 。
NoSQL主流软件:Memcached、Redis、MongoDB、Neo4j、FlockDB 。
Remote Dictionary Server(远程字段服务器)是一款高性能的(Key/Values)分布式内存数据库 支持数据持久化(定期把内存里数据存储到硬盘) 支持多种数据类型 string、list、hash 支持 master-slave 模式数据备份 。
中文网站 www.redis.cn 。
环境准备,创建template主机,ip地址为192.168.11.10 PS:官网稳定版6的版本,编译的时候一直报错找不到src目录 换成4版本成功的截图:
[root@template ~]# wget -c http://download.redis.io/releases/redis-4.0.8.tar.gz
# 安装编译环境gcc gcc-c++
[root@template~]# yum -y install gcc
# 解压到指定目录,个人习惯
[root@template ~]# tar xf redis-4.0.8.tar.gz -C /usr/local/
# 进入目录
[root@template ~]# cd /usr/local/redis-4.0.8/
[root@template redis-4.0.8]# ls
00-RELEASENOTES CONTRIBUTING deps Makefile README.md runtest runtest-moduleapi sentinel.conf tests utils
BUGS COPYING INSTALL MANIFESTO redis.conf runtest-cluster runtest-sentinel src TLS.md
# 编译安装
[root@template redis-4.0.8]# make && make install
# 测试
[root@template redis-4.0.8]# redis-
redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server
[root@template utils]# pwd
/usr/local/redis-4.0.8/utils
[root@template utils]# ./install_server.sh 执行源码目录下的初始化脚本
端口 6379
主配置文件 /etc/redis/6379.conf
日志文件 /var/log/redis_6379.log
数据库目录 /var/lib/redis/6379
服务启动程序 /usr/local/bin/redis-server
命令行连接命令 /usr/local/bin/redis-cli
# 运行初始化脚本,一路回车即可
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379] Selecting default: 6379 。
Please select the redis config file name [/etc/redis/6379.conf] Selected default - /etc/redis/6379.conf 。
Please select the redis log file name [/var/log/redis_6379.log] Selected default - /var/log/redis_6379.log 。
Please select the data directory for this instance [/var/lib/redis/6379] Selected default - /var/lib/redis/6379 。
Please select the redis executable path [/usr/local/bin/redis-server] 。
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful! #安装成功
[root@template utils]# ss -lntup | grep redis
tcp LISTEN 0 128 127.0.0.1:6379 *:* users:(("redis-server",pid=9043,fd=6))
[root@template utils]# /etc/init.d/redis_6379 stop
Stopping ...
Redis stopped
[root@template utils]#
[root@template utils]#
[root@template utils]# ss -lntup | grep redis
[root@template utils]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@template utils]# ss -lntup | grep redis
tcp LISTEN 0 128 127.0.0.1:6379 *:* users:(("redis-server",pid=10977,fd=6))
[root@template utils]# redis-cli
# 使用ping命令,查看连接是否成功,结果是PONG,则代表redis正常连接
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
127.0.0.1:6379> keys * #使用keys命令,查看当前库下的所有数据
127.0.0.1:6379> set school tarena #使用set命令,存入数据,school:tarena
127.0.0.1:6379> get school #使用get命令,从内存中,取出变量"school"对应的值
127.0.0.1:6379> keys * #使用keys命令,查看当前库下的所有数据
127.0.0.1:6379> exit #断开redis连接
PS:可以借助官方文档: https://docs.redis.com/ 。
[root@template utils]# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
# set命令,存数据,给变量赋值(x:99)【给单个变量赋值】
127.0.0.1:6379> set x 99
# mset命令,存数据,给变量赋值(i:77),(j:88),(k:99)【给多个变量同时赋值】
127.0.0.1:6379> mset i 77 j 88 k 99
# get命令,取数据,获取变量i的值【获取单个变量的值】
127.0.0.1:6379> get i
# mget命令,取数据,获取多个变量j,k,x的值【获取多个变量的值】
127.0.0.1:6379> mget i j k
1) "77"
2) "88"
3) "99"
# keys命令,显示所有的变量名【* 代表所有】
127.0.0.1:6379> keys *
1) "j"
2) "i"
3) "k"
4) "x"
# keys命令,显示变量名为一个字符的变量【? 代表单个字符】
127.0.0.1:6379> keys ?
1) "j"
2) "i"
3) "k"
4) "x"
# keys命令,显示变量名为六个字符的变量【? 代表单个字符】
127.0.0.1:6379> keys ??????
# keys命令,显示age的变量名,不存在,即为空
127.0.0.1:6379> keys age
(empty list or set)
# keys命令,显示school的变量名,存在
127.0.0.1:6379> keys school
# type命令,查看变量i的类型【string 为字符类型】
127.0.0.1:6379> type i
string
# set命令,存数据,给z赋值(z:10)【给单个变量赋值】
127.0.0.1:6379> set z 10
# type命令,查看变量z的类型【string 为字符类型】
127.0.0.1:6379> type z
string
# lpush命令,存数据,给变量赋值(hostname:pc99,pc88)【列表类型】
127.0.0.1:6379> lpush hostname pc99 pc88
(integer) 2
# type命令,查看变量hostname的类型【list 为列表类型】
127.0.0.1:6379> type hostname
list
# exists命令,检查变量是否存在,重复给一个变量赋值,会覆盖上一次变量的值
返回值为1,代表变量存在;返回值为0,则代表变量不存在
127.0.0.1:6379> exists hostname
(integer) 1
注意:在redis中,使用set和mset存入的数据,数据类型都是字符类型
# keys命令,查看redis中所有的变量
127.0.0.1:6379> keys *
# ttl命令,查看变量有效期,-1 为永不过期【不重启redis服务和清空内存的情况下】
127.0.0.1:6379> ttl j
(integer) -1
# expire命令,设置变量j的有效期为20秒
127.0.0.1:6379> expire j 20
(integer) 1
# ttl命令,查看变量有效期,16秒
127.0.0.1:6379> ttl j
(integer) 16
# ttl命令,查看变量有效期,当变量的有效期为-2时,到期,该变量会被删除
127.0.0.1:6379> ttl j
(integer) -2
# exists命令,检查变量是否存在,变量被删除,返回值为1,代表变量存在;返回值为0,则代表变量不存在
127.0.0.1:6379> exists j
(integer) 0
# select命令,切换库,切换到编号3的库下
127.0.0.1:6379> select 3
# 当前处于编号3库下, select命令,切换到编号1的库下
127.0.0.1:6379[3]> select 1
OK
# 当前处于编号1库下, select命令,切换到编号0的库下
127.0.0.1:6379[1]> select 0
OK
# 当前处于编号0库下,查看0库下所有的变量
127.0.0.1:6379> keys *
# 将编号0库下的变量school,移动到编号1的库下
127.0.0.1:6379> move school 1
(integer) 1
# 将编号0库下的变量x,移动到编号2的库下
127.0.0.1:6379> move x 2
(integer) 1
# 编号0库下,变量school和变量x消失
127.0.0.1:6379> keys *
# 查看编号1库下的所有变量,变量"school"移动过来了
127.0.0.1:6379> select 1
127.0.0.1:6379[1]> keys *
# 查看编号2库下的所有变量,变量"x"移动过来了
127.0.0.1:6379[1]> select 2
127.0.0.1:6379[2]> keys *
# save命令,把内存中的数据保存到硬盘中
127.0.0.1:6379[2]> save
127.0.0.1:6379[2]> exit
# 执行save命令后,内存中的数据被保存到下面文件中
[root@template utils]# ls /var/lib/redis/6379/
dump.rdb
# 连接数据库 redis-cli
# del命令,删除变量i
127.0.0.1:6379> del i
(integer) 1
# flushdb命令,删除当前所在库下的所有数据
127.0.0.1:6379> flushdb
# 查看编号0库下的所有变量,为空
127.0.0.1:6379> keys *
127.0.0.1:6379> select 1 #切换到其他库下,还有数据
127.0.0.1:6379[1]> keys *
# flushall命令,删除redis所有库下的数据
127.0.0.1:6379[0]> flushall
127.0.0.1:6379[1]> keys *
127.0.0.1:6379[1]> select 2
127.0.0.1:6379[2]> keys *
# shutdown停止服务
127.0.0.1:6379[2]> shutdown
not connected> exit
[root@template utils]]# ss -antlp | gre p6379
[root@template ~]# vim /etc/redis/6379.conf
.........
############################# INCLUDES ##############################
.........
############################# MODULES ##############################
.........
############################# NETWORK ##############################
.........
############################# GENERAL ##############################
[root@template ~]# vim /etc/redis/6379.conf
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
守护进程:指进程会一直存在,等待用户访问(耗资源,客户端访问速度快) 非守护进程:当服务运行后,如果一段时间内没有用户访问,服务会进入到休眠状态;当有用户访问时,服务会被唤醒,供用户去访问(节省资源,客户端访问速度慢一些) 。
70 bind 127.0.0.1 #指定客户访问的IP地址,这里只允许本机访问
93 port 6379 #指定redis的访问端口
137 daemonize yes #以守护进程方式运行(进程一直存在,等待用户访问)
172 logfile /var/log/redis_6379.log #记录redis运行的启动和运行过程中的信息
187 databases 16 #数据库个数,默认16个,可以修改
264 dir /var/lib/redis/6379 #定义数据库目录
533 # maxclients 10000 #客户端同时访问redis的并发数量,默认10000
.........
562 # MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
563 # is reached. You can select among five behaviors:
564 #
565 # volatile-lru -> 向redis中存入数据时,数据已满,则会在设置了TTL过期时间的变量中选择,删除最近最少使用的key,用于存放新的key;
566 # allkeys-lru -> 向redis中存入数据时,数据已满,则会在所有的变量中选择,删除最近最少使用的key,用于存放新的key;
567 # volatile-lfu -> 向redis中存入数据时,数据已满,则会在设置了TTL过期时间的变量中选择,删除使用频率最少的key,用于存放新的key;
568 # allkeys-lfu -> 向redis中存入数据时,数据已满,则会在所有的变量中选择,删除使用频率最少的key,用于存放新的key;
569 # volatile-random -> 向redis中存入数据时,数据已满,则会在设置了TTL过期时间的变量中选择,随机删除key,用于存放新的key;
570 # allkeys-random -> 向redis中存入数据时,数据已满,则会在所有的变量中选择,随机删除key,用于存放新的key;
571 # volatile-ttl -> 向redis中存入数据时,数据已满,删除最近过期的key;
572 # noeviction -> 向redis中存入数据时,数据已满,显示报错提示;
从物理内存中划分多少内存给redis使用,这里没有指定,则代表将本机的所有物理内存交给redis去使用 。
560 # maxmemory <bytes>
#maxmemory-policy 定义当内存空间不足时,删除已存储数据的方式,策略为 noeviction,即,即使内存使用完了,也不删除已存储的数据
591 # maxmemory-policy noeviction
#当使用lru,lfu,ttl 策略时,需要指定key模板的个数
602 # maxmemory-samples 5
[root@template ~]# /etc/init.d/redis_6379 stop #停掉redis的服务
[root@template ~]# vim /etc/redis/6379.conf
70 bind 192.168.4.50 #如果想让其他主机访问本机,修改监听地址为本机网卡地址
93 port 6350 #修改端口号为6350
501 requirepass 123456 #取消注释,修改用户连接redis的密码为123456
启动redis的服务
[root@template ~]# /etc/init.d/redis_6379 start
查看redis服务的端口号
[root@template ~]# ss -ntulp | grep redis
-h 指定要连接的主机,-p(小写) 指定连接端口号 。
[root@template ~]# redis-cli -h 192.168.4.50 -p 6350
192.168.4.50:6350> auth 123456 #auth 后跟上连接密码,否则无法正常使用
192.168.4.50:6350> ping
192.168.4.50:6350> exit
方法二:连接redis时,输入连接密码 -a 指定连接密码 。
[root@template ~]# redis-cli -h 192.168.4.50 -p 6350 -a 123456
192.168.4.50:6350> ping
192.168.4.50:6350> exit
当修改了redis服务的IP地址,密码和端口号以后,则无法通过脚本来停止redis服务 脚本停止服务针对的是redis服务默认的IP地址,密码和端口号 。
连接上redis, 使用shutdown来停止服务 。
[root@template ~]# redis-cli -h 192.168.4.50 -p 6350 -a 123456 shutdown
[root@template ~]# ss -ntulp | grep redis
[root@template ~]# /etc/init.d/redis_6379 start #启动服务
最后此篇关于非关系型数据库---Redis安装与基本使用的文章就讲到这里了,如果你想了解更多关于非关系型数据库---Redis安装与基本使用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
可以用这种方式转换字符串吗?我们有相同的参数,Java 做出了正确的选择。如果值是整数 - 我们调用 parseInt(value),否则如果值是 double 型 - 我们调用 parseDoubl
如果这段代码中有一个愚蠢的错误,我提前道歉,但我似乎无法解决它。我的问题是这样的,我用GCC-8(通过home-brew安装在Mac上)编译,然后在终端中执行。当使用 int do 定义变量 s &
我用 a-videosphere 制作了一个 a-scene。我尝试使用按钮启用/禁用声音,但有些想法不起作用?这是我的代码: var gargamel = 0; function
我正在使用 ISAAC 实现来生成随机整数。我需要用这些整数创建一个高斯值。首先,我需要将它们从 0 更改为 1 的 double 值。我怎样才能在Java中做到这一点?这是到目前为止我将整数转换为
我将 0x0000 到 0x01c2 范围内的十六进制值从 BLE 获取到我的手机 a 作为字符串。为了将其绘制在图表中,我必须将其转换为 double,我已经尝试过 this method但遗憾的是
我有一个父类(super class) Animal和一个子类 Dog 。在第三节课中,我有一个 List它同时接受子类型和父类(super class)型对象。 public class foo{
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
我正在尝试查询我的用户的距离。我可以用这段代码做到这一点 PFGeoPoint.geoPointForCurrentLocationInBackground { (geoPoint: PFGe
考虑示例:http://jsfiddle.net/KWLu7/16/ 我正在尝试将总体重要性值计算为每个选定选择重要性的总和乘以其父标准重要性: var watch = $scope.$watch("
这个问题在这里已经有了答案: Bounding generics with 'super' keyword (6 个答案) 关闭 2 年前。 我有一个列表装饰器,它应该允许从一个列表转换到另一个列表
为什么下面的代码没有选择最近父类(super class)型的隐式 val? class A class B extends A trait TC[-T] { def show(t: T): Stri
这是我想要做的 def merge[A, B, C](eithers: Either[A,B]*)(implicit ev1: A x, x => x)) 关于scala - 推断常见的父类(s
我正在尝试从具有 double 类型列的Cassandra表中获取 double 值。我已经使用CQL3语法创建了表: CREATE TABLE data_double ( datetime
是否应该在不需要显式类型定义的情况下编译以下 this ? def prepList[B >: A](prefix: PlayList[B]) : PlayList[B] = prefix.fol
我正在查看某人的代码,并且在创建结构时使用了 abstract type AbstractFoo end julia> struct Foo1 struct Foo2 foo_op(x::Abst
一些示例代码: public class Main { class SomeType { } class A { protected T createSome
是否可以只接受类的泛型类型的父类(super class)型? 我正在寻找的是这样的: class MyClass { public void myMethod(TS someObject
在我的代码中,我有许多 ArrayList 被传递到排序方法中。每个 ArrayList 都有不同的泛型类型,但所有这些类型都是 Sorter 的实现。排序方法旨在接受 Sorter 类型的 Arra
如果已经有人问过这个问题,请链接并关闭这个问题。 我目前正在为另一个使用起来复杂得多(并且有潜在危险)的 API 的简化 API 设计原型(prototype)。 考虑到相关的有点复杂的对象创建,我决
我正在尝试构建一个具有某些依赖项的 android 应用程序,但是其中一个导致了此错误: Illegal class file: Class module-info is missing a supe
我是一名优秀的程序员,十分优秀!