123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402(** A Redis client that provides a typeful API around commands.
Note that if you prefer a vanilla Redis client you can specify Bulk_io.String for
[Key] and [Value].
*)open!CoreopenAsynctype('a,'key,'field,'value)t=('a,'key,'field,'value)Client.tmoduletypeS=sigmoduleKey:sigtypetendmoduleField:sigtypetendmoduleValue:sigtypetendtype'at=('a,Key.t,Field.t,Value.t)Client.tvalcreate':?on_disconnect:(unit->unit)->?auth:Auth.t->where_to_connect:[<Socket.Address.t]Tcp.Where_to_connect.t->'a->'atDeferred.Or_error.tvalcreate:?on_disconnect:(unit->unit)->?auth:Auth.t->where_to_connect:[<Socket.Address.t]Tcp.Where_to_connect.t->unit->[`Primary]tDeferred.Or_error.tvalcreate_using_sentinel:?on_disconnect:(unit->unit)->?sentinel_auth:Auth.t->?auth:Auth.t->leader_name:string->where_to_connect:[<Socket.Address.t]Tcp.Where_to_connect.tlist->unit->[`Primary]tDeferred.Or_error.tvalclose:_t->unitDeferred.tvalclose_finished:_t->unitDeferred.tvalhas_close_started:_t->bool(** Redis commands are documented at: https://redis.io/commands *)valselect:[<`Primary|`Replica]t->int->unitDeferred.Or_error.tvalflushall:[<`Primary]t->unitDeferred.Or_error.tvalflushdb:[<`Primary]t->unitDeferred.Or_error.tvalshutdown:[<`Primary|`Replica|`Sentinel]t->unitDeferred.Or_error.tvalecho:[<`Primary|`Replica]t->Key.t->Key.tDeferred.Or_error.tvalping:[<`Primary|`Replica|`Sentinel]t->string->stringDeferred.Or_error.tvalincr:[<`Primary]t->Key.t->intDeferred.Or_error.tvaldel:[<`Primary]t->Key.tlist->intDeferred.Or_error.tvalunlink:[<`Primary]t->Key.tlist->intDeferred.Or_error.tvaldbsize:[<`Primary|`Replica]t->intDeferred.Or_error.tvalexists:[<`Primary|`Replica]t->Key.tlist->intDeferred.Or_error.tvalkeys:?pattern:string(** defaults to '*' *)->[<`Primary|`Replica]t->Key.tlistDeferred.Or_error.tvalrename:[<`Primary]t->Key.t->new_key:Key.t->unitDeferred.Or_error.tvalscan:[<`Primary|`Replica]t->cursor:Cursor.t->?count:int->?pattern:string->unit->(Cursor.t*Key.tlist)Deferred.Or_error.t(** Turn on Redis client tracking and provide a pipe of invalidation messages received
from the server. Closing the pipe turns tracking off.
The NOLOOP option is used, which means that subscribers will not see invalidation
messages caused by themselves, unless it is from the flushdb / flushall command.
Read here for more on usage:
https://redis.io/commands/client-tracking
https://redis.io/topics/client-side-caching
@param bcast Whether to use BCAST. Off by default.
*)valclient_tracking:[<`Primary|`Replica]t->?bcast:bool->unit->[`All|`KeyofKey.t]Pipe.Reader.tDeferred.Or_error.tvalset:[<`Primary]t->Key.t->?expire:Time_ns.Span.t->Value.t->unitDeferred.Or_error.tvalsetnx:[<`Primary]t->Key.t->Value.t->boolDeferred.Or_error.tvalmset:[<`Primary]t->(Key.t*Value.t)list->unitDeferred.Or_error.tvalmsetnx:[<`Primary]t->(Key.t*Value.t)list->boolDeferred.Or_error.tvalget:[<`Primary|`Replica]t->Key.t->Value.toptionDeferred.Or_error.tvalmget:[<`Primary]t->Key.tlist->Value.toptionlistDeferred.Or_error.tvalsmembers:[<`Primary|`Replica]t->Key.t->Value.tlistDeferred.Or_error.tvalsismember:[<`Primary|`Replica]t->Key.t->Value.t->boolDeferred.Or_error.tvalsmismember:[<`Primary|`Replica]t->Key.t->Value.tlist->boollistDeferred.Or_error.tvalsadd:[<`Primary]t->Key.t->Value.tlist->intDeferred.Or_error.tvalsrem:[<`Primary]t->Key.t->Value.tlist->intDeferred.Or_error.tvalzadd:[<`Primary]t->Key.t->([`Scoreoffloat]*Value.t)list->intDeferred.Or_error.tvalzrem:[<`Primary]t->Key.t->Value.tlist->intDeferred.Or_error.tvalpttl:[<`Primary|`Replica]t->Key.t->[`TimeoutofTime_ns.Span.t|`No_timeout|`No_key]Deferred.Or_error.tvalpexpire:[<`Primary]t->Key.t->?nx:bool->Time_ns.Span.t->[`Set|`Not_set]Deferred.Or_error.tvalpexpireat:[<`Primary]t->Key.t->?nx:bool->Time_ns.t->[`Set|`Not_set]Deferred.Or_error.tvalzrange:[<`Primary|`Replica]t->Key.t->min_index:int->max_index:int->Value.tlistDeferred.Or_error.tvalzscore:[<`Primary|`Replica]t->Key.t->Value.t->[`Scoreoffloat]optionDeferred.Or_error.tvalzrangebylex:[<`Primary|`Replica]t->Key.t->min:Value.tMaybe_bound.t->max:Value.tMaybe_bound.t->Value.tlistDeferred.Or_error.tvalzrangebyscore:[<`Primary|`Replica]t->Key.t->min_score:floatMaybe_bound.t->max_score:floatMaybe_bound.t->Value.tlistDeferred.Or_error.tvalzrangebyscore_withscores:[<`Primary|`Replica]t->Key.t->min_score:floatMaybe_bound.t->max_score:floatMaybe_bound.t->(Value.t*[`Scoreoffloat])listDeferred.Or_error.tvalzremrangebyscore:[<`Primary]t->Key.t->min_score:floatMaybe_bound.t->max_score:floatMaybe_bound.t->intDeferred.Or_error.tvalhexists:[<`Primary|`Replica]t->Key.t->Field.t->boolDeferred.Or_error.tvalhset:[<`Primary]t->Key.t->(Field.t*Value.t)list->intDeferred.Or_error.tvalhget:[<`Primary|`Replica]t->Key.t->Field.t->Value.toptionDeferred.Or_error.tvalhmget:[<`Primary|`Replica]t->Key.t->Field.tlist->Value.toptionlistDeferred.Or_error.tvalhgetall:[<`Primary|`Replica]t->Key.t->(Field.t*Value.t)listDeferred.Or_error.tvalhvals:[<`Primary|`Replica]t->Key.t->Value.tlistDeferred.Or_error.tvalhkeys:[<`Primary|`Replica]t->Key.t->Field.tlistDeferred.Or_error.tvalhlen:[<`Primary|`Replica]t->Key.t->intDeferred.Or_error.tvalhdel:[<`Primary]t->Key.t->Field.tlist->intDeferred.Or_error.tvalhscan:[<`Primary|`Replica]t->cursor:Cursor.t->?count:int->Key.t->(Cursor.t*(Field.t*Value.t)list)Deferred.Or_error.tvalkeyevent_notifications:[<`Primary|`Replica]t->([<Key_event.t]as'a)list->('a*Key.t)Pipe.Reader.tDeferred.Or_error.tvalkeyspace_notifications:[<`Primary|`Replica]t->([<Key_event.t]as'a)list->[`Patternsofstringlist|`KeysofKey.tlist]->('a*Key.t)Pipe.Reader.tDeferred.Or_error.tvalpublish:[<`Primary|`Replica]t->string->Key.t->intDeferred.Or_error.tvalsubscribe:[<`Primary|`Replica]t->stringlist->(string*Key.t)Pipe.Reader.tDeferred.Or_error.tvalsubscribe_raw:[<`Primary|`Replica]t->[`Literalofstringlist|`Patternofstringlist]->consume:((read,Iobuf.seek)Iobuf.t->subscription:string->'a)->'aPipe.Reader.tDeferred.Or_error.tvalpsubscribe:[<`Primary|`Replica]t->stringlist->(string*Key.t)Pipe.Reader.tDeferred.Or_error.tvalscript_load:[<`Primary|`Replica]t->string->Sha1.tDeferred.Or_error.tvalevalsha:[<`Primary|`Replica]t->Sha1.t->Key.tlist->Value.tlist->Resp3.tDeferred.Or_error.tvalraw_command:[<`Primary|`Replica|`Sentinel]t->stringlist->Resp3.tDeferred.Or_error.tvalversion:[<`Primary|`Replica|`Sentinel]t->stringDeferred.Or_error.tvalrole:[<`Primary|`Replica|`Sentinel]t->Role.tDeferred.Or_error.t(** ACL and authentication commands.
Read here for more:
https://redis.io/docs/manual/security/acl/#command-categories
https://redis.io/docs/manual/security/acl/#selectors
*)valacl_setuser:[<`Primary|`Replica|`Sentinel]t->username:string->rules:stringlist->unitDeferred.Or_error.tvalacl_deluser:[<`Primary|`Replica|`Sentinel]t->stringlist->intDeferred.Or_error.tvalacl_users:[<`Primary|`Replica|`Sentinel]t->stringlistDeferred.Or_error.tvalacl_list:[<`Primary|`Replica|`Sentinel]t->stringlistDeferred.Or_error.tvalacl_getuser:[<`Primary|`Replica|`Sentinel]t->username:string->Resp3.tDeferred.Or_error.tvalauth:[<`Primary|`Replica|`Sentinel]t->auth:Auth.t->unit->unitDeferred.Or_error.t(** Sentinel specific commands.
Read here for more: https://redis.io/docs/manual/sentinel/#sentinel-api *)valsentinel_leader:[<`Sentinel]t->string->Host_and_port.tDeferred.Or_error.t(** Streams *)valxadd:[<`Primary]t->Key.t->?stream_id:Stream_id.t->(Field.t*Value.t)list->Stream_id.tDeferred.Or_error.tvalxgroup_create:[<`Primary]t->Key.t->Group.t->?stream_id:Stream_id.t->?mkstream:unit->unit->[`Ok|`Already_exists]Deferred.Or_error.tvalxrange:[<`Primary|`Replica]t->Key.t->?start:Stream_id.t->?end_:Stream_id.t->?count:int->unit->(Stream_id.t*(Field.t*Value.t)list)listDeferred.Or_error.tvalxreadgroup:[<`Primary|`Replica]t->Group.t->Consumer.t->?count:int->?block:[`Don't_block|`Forever|`For_up_toofTime_ns.Span.t]->(Key.t*Stream_id.toption)list->(Key.t*(Stream_id.t*(Field.t*Value.t)list)list)listDeferred.Or_error.tvalxclaim:[<`Primary]t->?idle:Time_ns.Span.t->Key.t->Group.t->Consumer.t->min_idle_time:Time_ns.Span.t->Stream_id.tlist->(Stream_id.t*(Field.t*Value.t)list)listDeferred.Or_error.tvalxclaim_justid:[<`Primary]t->?idle:Time_ns.Span.t->Key.t->Group.t->Consumer.t->min_idle_time:Time_ns.Span.t->Stream_id.tlist->Stream_id.tlistDeferred.Or_error.tvalxautoclaim:[<`Primary]t->Key.t->Group.t->Consumer.t->min_idle_time:Time_ns.Span.t->start:Stream_id.t->?count:int->unit->([`Next_stream_idofStream_id.t]*(Stream_id.t*(Field.t*Value.t)list)list*[`No_longer_existofStream_id.tlist])Deferred.Or_error.tvalxack:[<`Primary]t->Key.t->Group.t->Stream_id.tlist->intDeferred.Or_error.tend